web-dev-qa-db-fra.com

Barre d'outils AppCompat v7 surOptionsItemSelected non appelée

Je suis passé de l'ActionBar d'origine à la barre d'outils AppCompat et à setSupportActionBar (barre d'outils) . Lorsque j'utilise getSupportActionBar () et setDisplayHomeAsUpEnabled (true) pour la flèche arrière, le clic n'appelle jamais à l'aide de la méthode d'écoute OnOptionsItemSelected ou autre.

Dois-je implémenter un auditeur spécial pour cela? Avant que tout fonctionne bien.

EDIT: Initialise la barre d’action:

mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mActionBar = getSupportActionBar();
mActionBar.setHomeButtonEnabled(true);

et après avoir remplacé le contenu par un fragment, je fais ceci:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
mDrawerToggle.setDrawerIndicatorEnabled(false);
mActionBar.setDisplayHomeAsUpEnabled(true);
41
Informatic0re

J'ai dû implémenter un OnClickListener pour DrawerToggle: 

mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        popStackIfNeeded();
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        mActionBar.setDisplayHomeAsUpEnabled(false);
        mDrawerToggle.setDrawerIndicatorEnabled(true);
    }
});

cela a résolu mon problème.

28
Informatic0re

J'ai eu plusieurs problèmes lors de l'utilisation de la méthode setSupportActionBar (). Il ignore également certains thèmes de couleur, vous ne pouvez donc pas styler la flèche arrière ou l'icône de débordement (vous ne savez pas lequel). Je viens de supprimer l'intégration ActionBar et d'utiliser la barre d'outils de manière native. Donc, au lieu de cela, vous pouvez le faire comme suit.

Incluez simplement la barre d’outils comme vous le feriez normalement, dans votre mise en page, en supposant qu’elle utilise un id de @ + id/toolbar.

Puis, dans le code:

_toolbar = (Toolbar) findViewById(R.id.toolbar);
_toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handleNavButtonPress();
    }
});
_toolbar.setOnMenuItemClickListener(_menuItemClickListener);
_toolbar.inflateMenu(R.menu.message_list_menu);
Menu menu = _toolbar.getMenu();

Dans ce cas, _menuItemClickListener peut presque littéralement être votre méthode actuelle onOptionsItemSelected () renommée. Vous n'avez simplement plus besoin de vérifier si le menu est nul.

Pour supprimer des éléments du menu, appelez simplement menu-> clear (). Ainsi, dans ma onPause, j'efface les menus et onResume, je les gonfle, dans mes fragments, et chaque fragment définit le gestionnaire de clics sur onResume. Vous devez toujours nettoyer, car Android ne le fera pas pour vous dans cette approche, et la barre d’outils continuera à ajouter des menus à chaque fois que vous gonflez.

Une dernière remarque, pour que tout fonctionne, vous devez complètement désactiver la barre d’action et la supprimer du style.

4
reactive-core

Si vous avez tout essayé et que cela ne fonctionne pas, vous pouvez implémenter votre propre écouteur de clics comme ceci:

myNavList.setOnItemClickListener(new Android.widget.AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String item = myNavList.getItemAtPosition(position).toString();
        Toast.makeText(this, "You selected " + item, Toast.LENGTH_SHORT).show();
    }
});
0
Prof

Une chose qui n'a pas été mentionnée:
Si vous créez le menu d'options de manière dynamique dans onCreateOptionsMenu et que vous retournez null là, le bouton Haut de la barre d'action ne fonctionnera pas.
Fonctionne bien si vous renvoyez le paramètre Menu sans rien y ajouter. 

Testé sur l'API d'émulateur 19

0
Max Izrin

Dans mon cas, la setHasOptionsMenu(true); n'a pas été activée sur onCreateView. J'espère que ça aide quelqu'un.

0
Coder Absolute