0

私はアプリを作成する方法を学び、ログインアクティビティを構築する方法とログインレイアウトに戻るためのログアウトメニューを作成しました。しかし、異なるレイアウトやアクティビティーをナビゲートすると、ログアウトするためのメニュー項目が重複して表示されます。私はそれが各レイアウトでメニューを作成することによると信じていますが、重複しないように変更する方法がわかりません。新しいレイアウトを開くとメニュー項目が複製されます

ここに私の断片です。

public class UserFragment extends Fragment { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle 
     savedInstanceState) { 
    return inflater.inflate(R.layout.activity_user_fragment, container, false); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    inflater.inflate(R.menu.fragment_logout, menu); 
} 
} 

マイLoginActivity.class

public class LoginActivity extends AppCompatActivity{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_login); 

    Button b1login = (Button) findViewById(R.id.btlogin); 
    Button b2login_cancel = (Button) findViewById(R.id.btcancel_login); 

    assert b1login != null; 
    b1login.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      EditText ed1 = (EditText) findViewById(R.id.etuser_name); 
      EditText ed2 = (EditText) findViewById(R.id.etpassword); 
      if (ed1.getText().toString().equals(getText(R.string.user_id)) && 
        ed2.getText().toString().equals(getText(R.string.user_password))) { 
       Toast.makeText(getApplicationContext(), R.string.successful_login, 
         Toast.LENGTH_SHORT).show(); 
       setContentView(R.layout.activity_clients); 


      } else { 
       Toast.makeText(getApplicationContext(), R.string.unsuccessful_login, 
         Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 

    assert b2login_cancel != null; 
    b2login_cancel.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      System.exit(0); 
     } 
    }); 
} 

//Menu option logout return to login screen. 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == R.id.menu_item_logout) { 
     Intent i = new Intent(this, LoginActivity.class); 
     this.startActivity(i); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 



public void addClient(View view) { 
    setContentView(R.layout.activity_new_client); 
} 

public void submitClient(View view) { 
    setContentView(R.layout.activity_sessions); 
} 

public void cancelClient(View view) { 
    setContentView(R.layout.activity_clients); 
} 


public void newSession(View view) { 
    setContentView(R.layout.activity_new_session); 
} 

public void cancelSessionCompletion(View view) { 
    setContentView(R.layout.activity_sessions); 
} 

public void cancelSession(View view) { 
    setContentView(R.layout.activity_sessions); 
} 
} 

フラグメントレイアウト。

<menu 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<item 
    android:id="@+id/menu_item_logout" 
    android:icon="@drawable/ic_logout" 
    android:title="@string/logout" 
    app:showAsAction="ifRoom|withText" /> 
</menu 

EDIT:

は私が最初にメニューならびにUserFragmentからメニューコードを作成し、ハード重複の問題を修正LoginActivityクラスにメニュー自体を符号化された断片を削除しました。

コード追加メニュー。

ただし、ログイン画面にメニューが表示されるようになりました。どうやってそこに表示されないようにしますか?ここで

+0

あなたはLoginActivityにログアウトメニューが表示されないようにしてください。 – Eenvincible

+0

ログインしたときにユーザーのユーザー名を表示する部分が読み込まれるように設定されているため、メニューはログイン画面に表示されません。 – Xiokraze

+0

重複の問題を修正したので、ログイン画面に表示されます。何か案は? – Xiokraze

答えて

1

異なるアクティビティで異なるメニュー項目を使用するには、異なるメニューXMLレイアウトを作成する必要があります。

したがって、menu.xmlという名前のファイルが既にresフォルダにあります。同じフォルダに新しいxmlファイルを作成する必要があります。

次に、そのアクティビティのJavaコード: - オーバーライドOncreateoptionmenuは、必要なメニューを展開します。

+0

すべてのアクティビティで同じメニュー項目(ログアウト)を表示します。何が起こっているのは、新しいレイアウトを読み込んだときに、メニューが複製されていることです。 – Xiokraze

+0

その後、同じメニューを表示するすべてのアクティビティで、inflate.inflate(OnCreateOptionMenu内)項目を同じxmlファイル名に変更します。 –

+0

私は正しい方法であなたの質問を得ていない場合はお知らせください。 –

1

はあなたが何をする必要があるかである:あなたのLoginActivityクラスで

  • 、あなたは、ユーザーがログアウトオプションを表示したくないので、メニューを膨らまないようにしたいです。
  • ログイン後にアクティビティが読み込まれると、実際にログアウトメニューが表示され、そのオプションを表示して使用する必要があるからです。あなたのコードで

、私はあなたのフラグメントはメソッドを使用していることを参照してください。あなたがここに何ができるか

setHasOptionsMenu(true); 

はセット、if文、ユーザーが以前にログインしている場合していないかどうかを確認するために使用されますそれ以外の場合はtrue、何もしない(falseに設定するなど)。

ユーザーは、これらのアクティビティからログアウトしたり、そのまま残すことができるようにするには、他のアクティビティでメニューを再利用できます。

こちらがお役に立てば幸いです。

EDIT

は、上記のサンプル・コードによると、あなたの最初の部分では、フラグメントのクラスの内部で何をするのかを示して - あなたはsetHasOptionsMenu(真)。今、あなたは、アクティビティとフラグメントの2つのログアウトメニューを持っているようです - あなたがLoginActivityであなたのフラグメントをどこで使用したかわかりません - 別のアクティビティの別の場所でなければ!

+0

LoginActivity.classで編集します。 – Xiokraze

+0

あなたのアクティビティがフラグメントを再利用している可能性がありますか? – Eenvincible

+0

私は、ユーザのユーザ名を表示するようにフラグメントを設定しているので、新しいレイアウトごとに再作成され、メニューが複製されることはありますか?私のボタンを意図して起動させ、実際に新しいアクティビティを実行してボタンをレイアウトにする代わりにレイアウトを設定する方が良いでしょうか? – Xiokraze

関連する問題