嗨,我正在开发一个Android应用程序。 在我的应用程序中,我正在使用Sherlock动作。 我在动作栏中定义了几个菜单项,如下面的方式
和我的action_button看起来像:
现在一切都显示了,但我的问题是,当我点击card_menu item ,我定义子菜单,并定义动作布局。 它没有显示那些子菜单。 我的其他菜单项正常工作。 只有当我为包含子菜单的项目定义动作布局时,我才能显示子菜单。 如果我删除动作布局,它工作正常。
我知道如果我们为item定义动作布局,那么我们必须手动处理click侦听器。 我是按照以下方式做到的
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; }
接受的答案对我不起作用。 我的子菜单在不同的设备上表现不同。 在摩托罗拉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(); }
它工作:)
完整的工作代码
码:
@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; }
请参阅答案
如果动作布局中有一个按钮,为了从菜单项获取回调,请不要忘记设置按钮
android:clickable="false"