0

J'apprends comment créer une application et ai trouvé comment créer une activité de connexion et un menu de déconnexion qui vous renvoie à la disposition de connexion. Cependant, si je navigue à travers mes différentes dispositions/activités, l'élément de menu pour la déconnexion des doublons. Je crois que c'est dû au fait que le menu a été créé sur chaque mise en page, mais je ne suis pas sûr de savoir comment le changer pour qu'il ne soit pas dupliqué.Lorsque j'ouvre de nouvelles mises en page, l'élément de menu duplique

Voici mon fragment.

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); 
} 
} 

Mon 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); 
} 
} 

mise en page de Fragment.

<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:

J'ai supprimé le fragment où j'ai d'abord créé le menu ainsi que le code de menu du UserFragment et codé en dur le menu lui-même dans la classe LoginActivity, qui fixe la question de la duplication.

Code d'ajout de code.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getMenuInflater().inflate(R.menu.menu, menu); 
    return true; 
    } 

Cependant, le menu s'affiche maintenant sur l'écran de connexion. Comment est-ce que je l'empêche de montrer là?

+0

Oui, je suis sûr que vous ne voulez pas de menu Déconnexion dans votre LoginActivity, car à ce moment-là, l'utilisateur n'est même pas connecté? – Eenvincible

+0

Le menu n'apparaît pas sur l'écran de connexion car je l'ai configuré pour charger le fragment qui affiche le nom d'utilisateur de l'utilisateur lorsqu'il est connecté. – Xiokraze

+0

Maintenant que j'ai résolu le problème de duplication, il apparaît sur l'écran de connexion. Des idées? – Xiokraze

Répondre

1

Pour avoir différents éléments de menu dans différentes activités, vous devez créer différentes mises en page de menus xml.

Donc, un fichier nommé menu.xml est déjà présent dans le dossier res. Vous devez créer un nouveau fichier XML dans le même dossier.Puis en code java de cette activité: - en override Oncreateoptionmenu gonfle le menu que vous voulez.

+0

Je veux le même élément de menu (déconnexion) affiché dans toutes les activités. Qu'est-ce qui se passe est quand je charge de nouvelles mises en page, le menu est en cours de duplication. – Xiokraze

+0

Ensuite, dans toutes les activités pour lesquelles vous souhaitez afficher le même menu, modifiez simplement l'élément inflate.inflate (dans OnCreateOptionMenu) au même nom de fichier xml. –

+0

S'il vous plaît faites-moi savoir si je ne reçois pas votre question correctement. –

1

Voici ce que vous devez faire:

  • Dans votre classe LoginActivity, vous voulez pas gonfler le menu parce que vous ne voulez pas que les utilisateurs à faire voir l'option de fermeture de session.
  • Dans votre activité qui se charge après la connexion, vous voulez réellement gonfler le menu Déconnexion - eh bien, parce que vous voulez qu'ils voient et utilisent cette option.

Dans votre code, je vois que votre fragment utilise la méthode:

setHasOptionsMenu(true); 

Ce que vous pouvez faire ici est d'utiliser une instruction if pour voir si un utilisateur a ouvert une session avant et sinon, réglez à vrai sinon, ne rien faire (ce qui revient à mettre à faux).

Vous pouvez réutiliser le menu dans d'autres activités si vous souhaitez autoriser les utilisateurs à se déconnecter de ces activités ou simplement les laisser!

J'espère que cela aide!

EDIT

Selon votre code exemple ci-dessus, votre première partie montre ce que vous feriez dans une classe Fragment - vous setHasOptionsMenu (true). Maintenant, il semble que vous avez deux menus de déconnexion, dans l'activité et dans le fragment - que je ne vois pas où vous avez utilisé votre fragment dans votre LoginActivity - à moins que ce soit ailleurs dans une activité différente!

+0

Je vais modifier dans mon LoginActivity.class. – Xiokraze

+0

Je pense que votre activité réutilise un fragment peut-être? – Eenvincible

+0

J'ai le fragment défini pour afficher le nom d'utilisateur de l'utilisateur, alors peut-être qu'il est recréé avec chaque nouvelle mise en page et duplique le menu? Serait-il préférable que mes boutons lancent une intention et lancent une nouvelle activité en définissant la mise en page plutôt que de faire appel aux boutons eux-mêmes? – Xiokraze