【发布时间】:2020-04-28 22:44:58
【问题描述】:
我有一个带有选项菜单的简单应用程序,它在片段开始时会发生变化。 问题是,在开始时,除了第一个 onCreateOptionsMenu() 之外的任何片段都被调用了两次 - 在 onCreate() 内和 onResume() 之后。 在 onCreate() 我通过 setHasOptionsMenu(true) 手动调用它,但在 onResume() 之后它不应该发生。 此外,这只发生在第一个片段开始之后。
这是基本片段代码:
class BaseFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle clicks
return true;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Create a menu
super.onCreateOptionsMenu(menu, inflater);
}
}
以及Activity中不断变化的片段代码:
public void startFragment(BaseFragment fragment) {
getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, fragment)
.commit();
}
该示例不使用任何外部库,如 ActionBarSherlock,仅使用 SupportLibrary。 我想,问题出在 FragmentTransaction replace() 方法中,因为它在第一个片段开始时工作正常。但我不知道,从哪里开始解决问题。我需要完全替换视图中的片段。
【问题讨论】:
-
您使用的是哪款手机?如果手机有一个专用的菜单按钮,onCreateOptionsMenu 只会在用户点击它时被调用。对于附加组件,setHasOptionsMenu(true) 不必须调用 onCreateOptionsMenu。它只是通知框架在填充菜单时片段想要参与。
-
当我遇到同样的问题时,OP 甚至不允许我添加/编辑问题。我知道关于菜单的基本知识,问题很奇怪,就像 OP 描述的那样。编辑:我正在使用嵌套片段
-
@prijupaul 它实际上仅适用于预蜂窝版本。在 Honeycomb 和之后的 onCreateOptionsMenu 将在您调用 setHasOptionsMenu() 后立即调用。
-
@Zyoo 我写的代码完全重现了这个错误。我以为我在某处犯了错误,所以用最少的代码创建了一个新项目。我还没有找到解决方案,必须更改代码,使其独立于此类行为。
-
好吧,好吧,我们有不同的问题或相同的问题,我会再给一些测试用例
标签: android android-fragments android-optionsmenu