带有actionLayout的Android操作栏菜单项无法正常工作

嗨,我正在开发一个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(); } }); 

我能够处理点击该项目的事件,但无法显示下拉菜单项。

我如何解决这个问题?

Solutions Collecting From Web of "带有actionLayout的Android操作栏菜单项无法正常工作"

在您的活动中试用此代码。
一定要妥善设置你的

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

接受的答案没有为我工作。 我的子菜单在不同的设备上performance不同。 在摩托罗拉Moto X上是这样的: 在这里输入图像说明

你可以看到子菜单位置错误(我点击了ActionBar右边的气泡图标)。

所以最后我想出了不同的解决scheme:改用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(); } 

它的工作:)

参考答案

如果在操作布局中有一个button,为了从菜单项中获得callback,不要忘记设置button

 android:clickable="false" 

完整的工作代码

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