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