webentwicklung-frage-antwort-db.com.de

Android-Aktionsleistenmenüelement mit actionLayout funktioniert nicht ordnungsgemäß

Hallo, ich entwickle eine Android-Anwendung. In meiner Anwendung verwende ich die Sherlock-Aktion. Ich habe einige Menüpunkte in der Aktionsleiste wie folgt definiert 

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

und mein action_button sieht so aus:

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

Jetzt wird alles angezeigt, aber mein Problem ist, dass ich, wenn ich auf card_menu item klicke, Untermenüs und Aktionslayouts definiere. Diese Untermenüs werden nicht angezeigt. Meine anderen Menüpunkte funktionieren einwandfrei. Nur wenn ich ein Aktionslayout für meinen Artikel definiere, der Untermenüs enthält, kann ich kein Untermenü anzeigen. Wenn ich das Aktionslayout entferne, funktioniert es gut.

Ich weiß, wenn wir das Aktionslayout für ein Element definieren, müssen wir den Click-Listener ..__ manuell handhaben. Das habe ich auf folgende Weise getan 

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

Ich kann mit dem Klicken auf ein Ereignis für dieses Element umgehen, aber keine Dropdown-Untermenüelemente anzeigen.

Wie löse ich dieses Problem?

22
nilkash

Versuchen Sie diesen Code in Ihrer Aktivität.
.__ Stellen Sie sicher, dass Sie Ihre 

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

Die akzeptierte Antwort funktionierte nicht für mich . Mein Untermenü verhielt sich auf verschiedenen Geräten unterschiedlich .enter image description here

Sie sehen, dass sich das Untermenü in einer falschen Position befindet (ich habe auf das Blasensymbol rechts von ActionBar geklickt).

Am Ende habe ich eine andere Lösung gefunden: Benutze stattdessen PopupMenu . Code sieht so aus:

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

Und es hat funktioniert :)

6
agamov

Vollständiger Arbeitscode

 <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

Siehe Antwort

Wenn sich im Aktionslayout eine Schaltfläche befindet, Um den Rückruf von einem Menüelement zu erhalten, vergessen Sie nicht, die Schaltfläche einzustellen 

Android:clickable="false"
0
Willy Chen