0

我有一个主 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上搜索了互联网,但我发现的大多数问题和解决方案都是关于未调用片段的菜单项单击事件。我的情况实际上是在 main 活动中没有调用此事件。我看不出我做错了什么。任何提示或帮助将不胜感激。谢谢

编辑

在我的 OnCreateOptionsMenu 中,我添加了这样的菜单(用于测试目的):

menu.AddSubMenu( "Test" );

对于这个从右上角的 3 点菜单中显示为下拉菜单的特定菜单,通常会调用 OnOptionsItemSelected。所以我认为我为显示菜单而膨胀的 xml 可能有问题。

4

1 回答 1

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。它是可点击的。所以我为它的点击事件提供了一个处理程序。这就是我解决问题的方法。还有其他更优雅的解决方案吗?

于 2013-10-31T21:10:21.417 回答