我为我的某个操作栏MenuBar设置了一个自定义视图,如下所示
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.loop_thread, menu);
ImageView iv = (ImageView)(getLayoutInflater().inflate(R.layout.image_container, null));
menu.findItem(R.id.action_filter).setActionView(iv);
...
但是当我在我的应用中点按该菜单项时,onOptionsItemSelected()
不会被调用。 (我已经通过在方法开头设置断点来验证这一点)。如果我点击其他按钮,在操作栏中,会调用onOptionsItemSelected()。
这是自定义视图的xml代码:
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ibtnFilterMenu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/darker_gray"
android:src="@drawable/btn_action_down_arrow"
style = "@android:style/Widget.ActionButton"/>
我也尝试在菜单xml文件中设置Action视图:
<item android:id="@+id/action_filter"
android:title="@string/filter_options"
android:actionLayout="@layout/image_container"
android:orderInCategory="100"
android:showAsAction="ifRoom" />
注意:我知道我可以使图像可点击,并为其手动设置onClickListener,但为了学习,我想深入了解这一点。
答案 0 :(得分:27)
似乎膨胀和绘制操作项的底层代码不会连接setActionView()
或android:actionLayout="@layout/image_container"
设置的自定义布局的内容。
可能是因为布局可以是任何东西,只是一个按钮或图像。所以我必须手动为图标设置onClickListener
。出于组织目的,我只需从我的图标的onOptionsItemSelected()
方法中调用OnClick
,但我可以在onClick
方法中定义操作。
首先,在Activity
。
MenuItem filterMenuItem;
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.loop_thread, menu);
filterMenuItem = menu.findItem(R.id.action_filter);
filterMenuItem.getActionView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity.this.onOptionsItemSelected(filterMenuItem);
}
});
答案 1 :(得分:-2)
你必须调用menu.add()方法并实现onPrepareOptionsmenu而不是oncreateoptionsmenu方法。这是我的代码:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
if(mAlbum.getStatus() == Album.STATUS_VIDEO_AVAILABLE)
{
menu.add(0, 0 , 0, getString(R.string.edit_album))
.setIcon(R.drawable.edit_album_icon);
menu.add(0, 1 , 0, getString(R.string.delete_album))
.setIcon(R.drawable.delete_album_icon);
menu.add(0, 2 , 0, getString(R.string.download_video))
.setIcon(R.drawable.download_vdo_icon);
menu.add(0, 3 , 0, getString(R.string.upload_to_ambivo))
.setIcon(R.drawable.share_ambivo_icon);
menu.add(0, 4 , 0, getString(R.string.upload_to_facebook))
.setIcon(R.drawable.share_fb_icon);
menu.add(0, 5 , 0, getString(R.string.upload_to_youtube))
.setIcon(R.drawable.share_yt_icon);
}
else{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.albummenu, menu);
if(mAlbum.getAlbumType() == Album.COMPOSITE_VIDEOS)
menu.findItem(R.id.convert_album).setVisible(false);
}
return true;
}