Android 菜单中的片段不显示

Android 菜单中的片段不显示,android,android-fragments,android-menu,Android,Android Fragments,Android Menu,对于我最后的问题,我得到了非常有用的提示,我希望这次不会有什么不同:)首先,让我解释一下情况。我有一个有两个片段的活动。对于每个片段,我都有一个xml菜单布局,第一个有四个菜单项,第二个只有一个。现在,首先加载带有四个菜单项的片段。 在其onCreate方法中,我设置了 this.setHasOptionsMenu(true); this.setHasOptionsMenu(true); onCreateOptions菜单方法 @Override public void onCreateO

对于我最后的问题,我得到了非常有用的提示,我希望这次不会有什么不同:)首先,让我解释一下情况。我有一个有两个片段的活动。对于每个片段,我都有一个xml菜单布局,第一个有四个菜单项,第二个只有一个。现在,首先加载带有四个菜单项的片段。 在其onCreate方法中,我设置了

this.setHasOptionsMenu(true);
this.setHasOptionsMenu(true);
onCreateOptions菜单方法

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_fragshow, menu);
}
@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    Log.i("FragCreateList","onCreateOptionsMenu called");
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_fragcreatelist, menu);
}
xml文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_refresh"
      android:icon="@drawable/ic_action_search"
      android:title="Refresh"
      android:visible="true"
      android:showAsAction="ifRoom|withText" />
<item android:id="@+id/menu_clearall"
      android:icon="@drawable/ic_action_search"
      android:title="Clear"
      android:visible="true"
      android:showAsAction="ifRoom|withText" />
<item android:id="@+id/menu_addcontent"
      android:icon="@drawable/ic_action_search"
      android:title="Add Content"
      android:visible="true"
      android:showAsAction="ifRoom|withText" />
<item android:id="@+id/menu_newlist"
      android:icon="@drawable/ic_action_search"
      android:title="New List"
      android:visible="true"
      android:showAsAction="ifRoom|withText" />    
</menu>
onCreateOptions菜单方法

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_fragshow, menu);
}
@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    Log.i("FragCreateList","onCreateOptionsMenu called");
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_fragcreatelist, menu);
}
xml文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_editdone"
      android:icon="@drawable/ic_action_search"
      android:title="Edit Done"
      android:visible="true"
      android:showAsAction="ifRoom|withText" />         
</menu>

但在新片段中,我看不到任何菜单项。既不在操作栏中,也不在我按下硬件菜单按钮时。在前一个片段中,actionbar中有两个菜单项,其余两个在按下硬件按钮时出现。但这里什么都没有显示。我得到一条logcat消息,onCreateOptionsMenu方法被调用,但什么也没发生。(我甚至得到了对我的(empty)onPrepareOptions菜单方法的调用,该方法应该在菜单显示之前调用,但仍然没有任何结果)有什么可能是错误的线索吗?调用InvalidateOptions菜单没有任何作用。此外,我不知道该调用哪个,因为有一个getActivity().InvalidateOptions菜单和一个getFragmentManager().InvalidateOptions菜单。。。 提前谢谢

编辑:

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="15" />


尝试在片段中将onCreateOptions菜单更改为onPrepareOptions菜单,我遇到了同样的问题,据我记忆,这为我解决了问题…

在片段中注册选项/上下文菜单时,通常需要等待onActivityCreated()调用,以确保有一个活动将菜单绑定到该活动。尝试此处建议的修复方案,看看是否有帮助:

在打开菜单之前使用menu.clear()

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.mnulayout, menu);
}

我也有同样的问题。我通过在应用于myApp上下文的项目中使用showAsAction修复了它:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:myapp="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_refresh"
          android:icon="@drawable/ic_refresh"
          android:title="refresh"
          android:visible="true"
          myapp:showAsAction="ifRoom|withText"/>
</menu>


抱歉,这对您来说太晚了,但它可能对其他人有用。

我在onCreateView中添加了设置选项菜单(true),效果很好

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    setHasOptionsMenu(true);
    return inflater.inflate(R.layout.my_example_fragment, container, false);

}

这是因为您的设备具有硬件菜单按钮。所以变量“sHasPermanentMenuKey”的值在ViewConfiguration中为true。必须使用反射将此变量的值设置为false。例如:

// this method force showing menu button in device with hardware menu button
private void showOverflowMenu(FragmentActivity activity) {
    try {
        ViewConfiguration config = ViewConfiguration.get(activity);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if (menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

注意:在activity的onCreate()中使用此方法,而不是在fragment的onCreate()方法中使用此方法。

这是一个非常晚的添加,因为上面的建议都没有解决我的问题。我的设备(2.3.5)的选项菜单出现了严重的计时问题,因此我不得不走另一条路线,使用活动中的充气机在onprepare部件中创建菜单:

@Override
public void onPrepareOptionsMenu(Menu menu)
{
    if (Build.VERSION.SDK_INT < 11) {
        menu.clear();
        getActivity().getMenuInflater().inflate(R.menu.message_thread, menu);
    }
@覆盖
在PrepareOptions功能表(菜单)上公共作废
{
if(Build.VERSION.SDK_INT<11){
menu.clear();
getActivity().getMenuInflater().充气(R.menu.message_线程,菜单);
}

您的活动需要扩展ActionBarActivity。您可能有一个只扩展活动的活动。strong text这实际上对我有效,也可能是您的解决方案

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);
}

获取片段类,以便查看菜单添加 onCreateView()方法或onCreateAcivity()方法中的SetHasOptions菜单(true)。
但是我把我的添加到了onCreateView()方法中。希望它能帮助别人。首先,你的片段必须在
onCreate

    setHasOptionsMenu(true);
然后你必须检查你的活动是否没有类似NoActionBar的主题
这有点棘手,但如果你的活动具有该主题,那么无论你在哪里调用
设置选项菜单(true)
你都不会画她

确保你设置了
设置支持操作栏(youtoolbar)
如果您在活动中使用
工具栏

选项菜单可能会隐藏,但可以工作。您可以通过长按硬件按钮“最近的应用”来检查这一点

除了上述隐藏菜单的原因外,可能还有一个主题没有在AndroidManifest.xml中指定操作栏

    <application
        ...
        android:theme="@style/Theme.Design.NoActionBar"
        ...
    </application>
此代码解释了显示片段OnOptionItem选择项的解决方案。
和单击选项菜单中项目的列表

如果应用程序对每个片段使用自定义工具栏。

FragmentTest.java

测试布局.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbarRegistration_id"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:contentInsetLeft="0dp"
        android:background="@color/purple_700"
        app:contentInsetStart="0dp">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:id="@+id/imageView_toolbar_cancel_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/cancel_icon"
                android:layout_centerVertical="true"
                android:layout_marginLeft="5dp">
            </ImageView>
            <TextView
                android:id="@+id/toolbar_textViewheader_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="50dp"
                android:textColor="@color/white"
                android:textStyle="bold"
                android:text="Registration"
                android:textSize="20dp">
            </TextView>
        </RelativeLayout>
    </androidx.appcompat.widget.Toolbar>
</RelativeLayout>

菜单测试



将其更改为@Override public void on prepareoptionsmenu(菜单菜单菜单){Log.i(“FragCreateList”,“onPrepareOptionsMenu called”);MenuInflater inflater=new MenuInflater(getActivity());inflater.inflate(R.Menu.menufragcreatelist,Menu);}但还是什么都没有…什么都没有显示。奇怪的是,我有两个片段的活动,经典模式,活动本身有一个菜单,每个片段都有自己的菜单。我有活动中的onCreateOptions菜单和片段中的onPrepareOptions菜单。我有三个显示组合的菜单…可能我们误解了,我不希望所有的菜单组合在一起,我希望这两个单独的菜单显示在两个单独的片段中,但只有一个片段显示菜单。我最初在活动中也使用了onCreateOptions,但由于我认为这更有意义,所以将所有内容都移动到片段中。我只是用不同的设计方法解决了我的问题,但我仍然想知道为什么它不起作用:)谢谢您的努力。@EI Duderiu没有同样的问题,你是如何解决的?嘿,jsmith,这是关于上下文菜单的,我分别谈论的是actionbar菜单项或hardware button菜单项。是的,我理解。在阅读这个问题时,似乎暗示你调用SetHasOptions菜单(true)在fragments onCreate中。我建议您将其移动到两个片段的onActivityCreated()方法。这适用于选项菜单和上下文菜单。注意:使用
android:showAsAction
似乎没有效果