我有一个主SherlockFragmentActivity,只显示一个菜单项(“完成”)的actionbarsherlock。我正在使用自定义视图实现此菜单:
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_menu_done"
android:icon="@drawable/checkmark"
android:title="Done"
android:showAsAction="always|withText"
android:actionLayout="@layout/menu_done_extended" />
</menu>
这里是menu_done_extended.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu_container"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="14dp"
android:paddingBottom="14dp"
android:gravity="center"
android:text="Done"
android:drawableLeft="@drawable/checkmark"
android:background="@drawable/selectable_background_zando_theme_red"
android:clickable="true" />
<View
android:layout_width="20dp"
android:layout_height="wrap_content" />
</LinearLayout>
在我的活动中,我重写OnCreateOptionsMenu以显示此菜单:
public override bool OnCreateOptionsMenu( ActionBar_Sherlock.View.IMenu menu )
{
SupportMenuInflater.Inflate( Resource.Layout.menu_done, menu );
return true;
}
最后我重写OnOptionsItemSelected(在主活动中)来处理菜单点击事件。
public override bool OnOptionsItemSelected( ActionBar_Sherlock.View.IMenuItem item )
{
switch( item.ItemId )
{
case Resource.Id.action_menu_done:
{
// do some job....
return true;
}
break;
}
return base.OnOptionsItemSelected( item );
}
但是当我单击菜单项时,永远不会调用OnOptionsItemSelected。我指出我的主要活动是一个片段。但是这个片段不会修改主菜单(不会覆盖从片段调用的OnCreateOptionsMenu或OnOptionsItemSelected)。我在stackoverflow上搜索了互联网,但我发现的大多数问题和解决方案都是关于菜单项点击事件来自片段未被调用。我的情况实际上是这个事件在主要活动中不被称为 。我看不出我做错了什么。 任何提示或帮助将不胜感激。 谢谢
修改
在我的OnCreateOptionsMenu中,我添加了一个这样的菜单(用于测试目的):
menu.AddSubMenu( "Test" );
对于此特定菜单(从右上角的3点菜单显示为下拉菜单),正常调用OnOptionsItemSelected。所以我认为xml上可能出现了一些错误,我通过膨胀来显示菜单。
答案 0 :(得分:0)
我终于找到了解决方案。由于我正在膨胀视图以用作菜单项,因此我必须在单击菜单时自己提供处理程序。这就是我所做的:
SupportMenuInflater.Inflate( Resource.Layout.menu_done, menu );
ActionBar_Sherlock.View.IMenuItem item = menu.FindItem( Resource.Id.action_menu_done );
LinearLayout layout = item.ActionView.FindViewById<LinearLayout>(Resource.Id.menu_container );
layout.Click +=new EventHandler(layout_Click);
Resource.Id.menu_container是在我的虚增视图中定义的LinearLayout。它是可点击的。所以我为其click事件提供了一个处理程序。这就是我解决问题的方法。还有其他更优雅的解决方案吗?