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?
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;
}
Die akzeptierte Antwort funktionierte nicht für mich . Mein Untermenü verhielt sich auf verschiedenen Geräten unterschiedlich .
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 :)
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;
}
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"