web-dev-qa-db-fra.com

L'élément de menu de la barre d'action Android avec actionLayout ne fonctionne pas correctement

Bonjour, je développe une application Android. Dans mon application, j'utilise l'action Sherlock. J'ai défini quelques éléments de menu dans la barre d'action, comme ci-dessous 

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item
        Android:id="@+id/card_menu"
        Android:actionLayout="@layout/action_button"
        Android:showAsAction="always"
        Android:title="cards">
        <menu>
            <item
                Android:id="@+id/C1"
                Android:title="C1"/>
            <item
                Android:id="@+id/C2"
                Android:title="c2"/>
            <item
                Android:id="@+id/C3"
                Android:title="C3"/>
        </menu>
    </item>
    <item
        Android:id="@+id/notification"
        Android:actionLayout="@layout/notification_icon"
        Android:icon="@drawable/notification"
        Android:showAsAction="always"
        Android:title="Notifications"/>

    <item
        Android:id="@+id/filter"
        Android:icon="@drawable/filter"
        Android:showAsAction="always"
        Android:title="Filter"/>
</menu>

et mon action_button ressemble à:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content">

    <ImageView
        Android:id="@+id/menu_img"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/spinner_ab_focused_maroon"/>
    <TextView
        Android:id="@+id/menu_text"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_toRightOf="@+id/imageView0"
        Android:text="C1"/>
</RelativeLayout>

Maintenant, tout est affiché, mais le problème est que lorsque je clique sur card_menu item, je définis des sous-menus et définit également la disposition des actions. Cela ne montre pas ces sous-menus. Mes autres éléments de menu fonctionnent correctement. Ce n'est que lorsque je définis un format d'action pour mon article contenant des sous-menus que je ne peux pas afficher de sous-menu. Si je supprime la disposition d'action, cela fonctionne bien.

Je sais que si nous définissons la disposition des actions pour un élément, nous devons gérer manuellement l'écouteur de clics ..__Je l'ai fait de la manière suivante 

final MenuItem item = menu.findItem(R.id.card_menu);
        item.getActionView().setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                onOptionsItemSelected(item);
                Toast.makeText(getActivity(), "click on menu", Toast.LENGTH_SHORT).show();
            }
        });

Je suis capable de gérer les événements de clic pour cet élément, mais je ne peux pas afficher les éléments du sous-menu déroulant.

Comment résoudre ce problème?

22
nilkash

Essayez ce code dans votre activité.
Assurez-vous de bien configurer votre 

R.menu.menuidentifier

R.id.menuitemidentifier

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.actionbarhelpmenu, menu);
        final Menu m = menu;
        final MenuItem item = menu.findItem(R.id.ActionConnection);
        item.getActionView().setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {   
                m.performIdentifierAction(item.getItemId(), 0);
            }
        });
        return true;
    }
52
ericharlow

La réponse acceptée ne fonctionnait pas pour moi ... Mon sous-menu se comportait différemment selon les appareils ... sur Motorola Moto X:enter image description here

Vous pouvez voir que le sous-menu est dans la mauvaise position (j'ai cliqué sur l'icône en forme de bulle à droite de la barre d'actions).

Donc à la fin, je suis venu avec une solution différente: utilisez PopupMenu à la place . Le code ressemble à ceci:

@Override
public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_fragment_chat, menu);
    final MenuItem item = menu.findItem(R.id.menu_item_actionbar_avatar);
    MenuItemCompat.getActionView(item).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showProfileMenuPopup(v);
        }
    });
}

public void showProfileMenuPopup(View v) {
    PopupMenu popup = new PopupMenu(getActivity(), v);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.menu_avatar_actions, popup.getMenu());
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem menuItem) {
            return false;
        }
    });
    popup.show();
}

Et ça a marché :)

6
agamov

Code de travail complet

 <item
    Android:title="search"
    Android:id="@+id/mSearch"
    app:actionLayout="@layout/my_custom_menu_item"
    Android:orderInCategory="100"
    app:showAsAction="always"/>

Code:

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.menu,menu); MenuItem item = menu.findItem(R.id.mSearch);
    ImageView iv= (ImageView) item.getActionView().findViewById(R.id.search_1);
    iv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(context, "clicked", Toast.LENGTH_SHORT).show();
        }
    });
    return true;
}
1
Aklesh Singh

Reportez-vous à la répondre

S'il y a un bouton dans la structure d'action, Afin d'obtenir le rappel depuis l'élément de menu, n'oubliez pas de définir le bouton 

Android:clickable="false"
0
Willy Chen