片段中的菜单未显示

问题描述 投票:0回答:17

我对上一个问题得到了非常有用的提示,我希望这次不会有所不同:)首先,让我解释一下情况。我有一个包含 2 个片段的活动。对于每个片段,我都有一个 xml 菜单布局,第一个有四个菜单条目,第二个只有一个。现在,首先加载具有四个菜单条目的片段。 在它的 onCreate 方法中我设置了

this.setHasOptionsMenu(true);

onCreateOptionsMenu 方法

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_fragshow, 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>

这个效果很好。所有菜单项都在那里,我可以单击它们并做出响应。现在,当我单击“添加内容”菜单时,会加载另一个片段。我也在那里设置

this.setHasOptionsMenu(true);

onCreateOptionsMenu 方法

@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>

但是在新片段中我看不到任何菜单项。无论是在操作栏中,还是当我按下硬件菜单按钮时。在前一个片段中,两个菜单项位于操作栏中,其余两个在按下硬件按钮时出现。但这里没有显示任何内容。我收到 logcat 消息,表明 onCreateOptionsMenu 方法被调用,但没有任何反应。 (我什至调用了我的(空)onPrepareOptionsMenu 方法,该方法应该在显示菜单之前调用,但仍然没有任何线索)有什么线索可能是错误的吗?调用 invalidateOptionsMenu 不会执行任何操作。此外,我不确定要调用哪一个,因为有一个 getActivity().invalidateOptionsMenu 和一个 getFragmentManager().invalidateOptionsMenu ... 预先感谢。

编辑:

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="15" />
android android-fragments android-menu
17个回答
94
投票

我在 onCreateView 中添加了 setHasOptionsMenu(true) 并且工作正常

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

}

55
投票

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

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

14
投票

首先,您的片段必须位于

onCreate

    setHasOptionsMenu(true);

然后你必须检查你的活动是否没有类似 NoActionBar 的主题 这有点棘手,但如果你的活动有这个主题,无论你在哪里称呼

setHasOptionsMenu(true)
,你的片段都不会画她


8
投票

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

<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>

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


7
投票

这实际上对我有用,也可能是您的解决方案。

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

6
投票

发生这种情况是因为您的设备有硬件菜单按钮。因此 ViewConfiguration hasPermanentMenuKey() 中变量“sHasPermanentMenuKey”的值为 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() 方法中使用。


4
投票

如果您在活动中使用

setSupportActionBar(youtoolbar)
,请确保设置
Toolbar


3
投票

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

ListFragment 的上下文菜单


2
投票

对于片段类,为了让您看到菜单添加 在 onCreateView() 方法或 onCreateAcivity() 方法中 sethasoptionsmenu(true) 。 但我将我的添加到 onCreateView() 方法中。希望它对某人有帮助


1
投票

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

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

    <application
        ...
        android:theme="@style/Theme.Design.NoActionBar"
        ...
    </application>

1
投票

此代码解释了显示 Fragment OnOptionItem 选择项的解决方案。 和选项菜单中项目的 OnClicklistner

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

FragmentTest.java

public class FragmentTest extends BaseFragmentHelper {
    public static final String TAG = FragmentRegistration.class.getSimpleName();
    View testFragmetnView;
   
    Toolbar toolbarRegistration;

    @Override
    public void onAttachFragment(@NonNull Fragment childFragment) {
        super.onAttachFragment(childFragment);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        testFragmetnView= inflater.inflate(R.layout.test_layout, container, false);
        //Intialize Toolbar
        toolbarRegistration=(Toolbar) registrationFragmentView.findViewById(R.id.toolbarRegistration_id);
        //inflate Menu layout
        toolbarRegistration.inflateMenu(R.menu.menu_test);
        //onOption Menu OnClicklistner
        toolbarRegistration.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
           switch (item.getItemId()){
                case R.id.test1:{
                    Toast.makeText(getActivity(),"Test 1",Toast.LENGTH_SHORT).show();
                    break;
                }
                case R.id.test2:{
                    Toast.makeText(getActivity(),"Test 2",Toast.LENGTH_SHORT).show();
                    break;
                }
            }
            return false;
        }
    });
        return testFragmetnView;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
         setHasOptionsMenu(true);
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    public void onResume() {
        super.onResume();

    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    @Override
    public String toString() {
        return FragmentTest.class.getSimpleName();
    }
  }

test_layout.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>

菜单测试

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/test1"
        android:title="Test 1"
        android:visible="true" />
    <item
        android:id="@+id/test2"
        android:title="Test 2"
        android:visible="true"
        />
</menu>

0
投票

尝试将 onCreateOptionsMenu 更改为 onPrepareOptionsMenu 片段,我遇到了同样的问题,据我记得这为我解决了它......


0
投票

您的 Activity 需要扩展 ActionBarActivity。您可能有一个仅扩展 Activity 的内容。强文本


0
投票

如果所有解决方案均无效,请尝试以下操作:

onCreateView()
方法中添加以下行

setHasOptionsMenu(true)

还在

onViewCreated()
方法中添加以下行

(activity as AppCompatActivity?)!!.setSupportActionBar(customToolbar as Toolbar?)

其中customToolBar是xml文件中添加的工具栏的id


0
投票

如果您使用自定义工具栏并且看不到菜单,请尝试以下方法:

private fun configureOverflowMenu(toolbar: Toolbar) {
    toolbar.inflateMenu(R.menu.menu_share)
    toolbar.setOnMenuItemClickListener {
        when (it.itemId) {
            R.id.menuShare -> {
                //Do something
                true
            }
            else -> false
        }
    }
}

并按如下方式调用此方法:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    configureOverflowMenu(customToolbar as Toolbar)
}

0
投票

为了在片段中显示溢出菜单,请在“onViewCreated”方法中为自定义工具栏添加以下代码:

(activity as AppCompatActivity?)?.setSupportActionBar(binding.customToolbar.toolBar as Toolbar?)

-1
投票

很晚才添加,因为上面的建议都没有解决我的问题。我的设备(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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.