こんにちは、Androidアプリケーションを開発しています。アプリケーションでは、Sherlockアクションを使用しています。次のようにアクションバーにいくつかのメニュー項目を定義しています
<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>
私のaction_buttonは次のようになります:
<?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>
これですべてが表示されますが、問題はcard_menu item
ここで、サブメニューを定義し、アクションレイアウトも定義します。これらのサブメニューは表示されていません。私の他のメニュー項目は正常に機能しています。サブメニューを表示できないサブメニューを含むアイテムのアクションレイアウトを定義する場合のみ。アクションレイアウトを削除すると、正常に機能します。
アイテムのアクションレイアウトを定義する場合は、クリックリスナーを手動で処理する必要があります。私は次のようにそれをしました
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();
}
});
そのアイテムのクリックイベントを処理することはできますが、ドロップダウンサブメニューのアイテムを表示することはできません。
この問題を解決するにはどうすればよいですか?
アクティビティでこのコードを試してください。
必ず適切に設定してください
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;
}
受け入れられた答えは私にはうまくいきませんでした。サブメニューは、デバイスごとに異なる動作をしました。 Motorola Moto Xでは次のようになりました。
サブメニューが間違った位置にあることがわかります(ActionBarの右側にあるバブルアイコンをクリックしました)。
そのため、最後に別のソリューションを思いつきました。代わりにPopupMenuを使用してください。コードは次のようになります。
@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();
}
そして、それは働いた:)
完全に機能するコード
<item
Android:title="search"
Android:id="@+id/mSearch"
app:actionLayout="@layout/my_custom_menu_item"
Android:orderInCategory="100"
app:showAsAction="always"/>
コード:
@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;
}
answer を参照してください
アクションレイアウトにボタンがある場合、メニュー項目からコールバックを取得するために、ボタンを設定することを忘れないでください
Android:clickable="false"