我对上一个问题得到了非常有用的提示,我希望这次不会有所不同:)首先,让我解释一下情况。我有一个包含 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" />
我在 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);
}
在展开菜单之前使用menu.clear()。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.mnulayout, menu);
}
首先,您的片段必须位于
onCreate
setHasOptionsMenu(true);
然后你必须检查你的活动是否没有类似 NoActionBar 的主题 这有点棘手,但如果你的活动有这个主题,无论你在哪里称呼
setHasOptionsMenu(true)
,你的片段都不会画她
我也有同样的问题。我通过使用项目中的 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>
抱歉,这对你来说太晚了,但对其他人可能有用。
这实际上对我有用,也可能是您的解决方案。
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
发生这种情况是因为您的设备有硬件菜单按钮。因此 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() 方法中使用。
如果您在活动中使用
setSupportActionBar(youtoolbar)
,请确保设置 Toolbar
。
在片段中注册选项/上下文菜单时,通常需要等到 onActivityCreated() 调用以确保有一个活动可以将菜单绑定到。 尝试此处建议的修复,看看是否有帮助:
对于片段类,为了让您看到菜单添加 在 onCreateView() 方法或 onCreateAcivity() 方法中 sethasoptionsmenu(true) 。 但我将我的添加到 onCreateView() 方法中。希望它对某人有帮助
选项菜单可能是隐藏的,但可以使用。您可以通过长按硬件按钮“最近使用的应用程序”来检查这一点。
除了上述隐藏菜单的原因外,可能还有一个主题没有在 AndroidManifest.xml 中指定操作栏
<application
...
android:theme="@style/Theme.Design.NoActionBar"
...
</application>
此代码解释了显示 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>
尝试将 onCreateOptionsMenu 更改为 onPrepareOptionsMenu 片段,我遇到了同样的问题,据我记得这为我解决了它......
您的 Activity 需要扩展 ActionBarActivity。您可能有一个仅扩展 Activity 的内容。强文本
如果所有解决方案均无效,请尝试以下操作:
在
onCreateView()
方法中添加以下行
setHasOptionsMenu(true)
还在
onViewCreated()
方法中添加以下行
(activity as AppCompatActivity?)!!.setSupportActionBar(customToolbar as Toolbar?)
其中customToolBar是xml文件中添加的工具栏的id
如果您使用自定义工具栏并且看不到菜单,请尝试以下方法:
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)
}
为了在片段中显示溢出菜单,请在“onViewCreated”方法中为自定义工具栏添加以下代码:
(activity as AppCompatActivity?)?.setSupportActionBar(binding.customToolbar.toolBar as Toolbar?)
很晚才添加,因为上面的建议都没有解决我的问题。我的设备(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);
}