onOptionsItemSelected 未调用按下片段上的导航图标
onOptionsItemSelected not called pressing up navigation icon on fragment
标题几乎是不言自明的。
架构:
- 我有扩展 AppCompatActivity 的 Main activity。
- 我还有一个抽屉布局。此菜单的每个选项都会打开一个片段。
- 每个片段都有自己的菜单布局,通过 setHasOptionsMenu(true) 和自己的按钮。他们菜单的主页按钮仍然是打开抽屉布局的入口。
- 其中一个片段有一个项目列表,当单击其中一个项目时,将打开一个新的 child 片段。 (问题出在这里)我希望这个 child 片段能够通过单击其工具栏上的向上图标向上导航至其 parent。
我在替换片段之前禁用了抽屉切换并设置了 Home As Up 指示器:
mDrawerToggle.setDrawerIndicatorEnabled(false);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
actionBar.setHomeAsUpIndicator(R.drawable.ic_arrow_back_white_24dp);
actionBar.setDisplayHomeAsUpEnabled(true);
然后,当点击UP图标时,没有任何反应。我调试了它并且没有调用 onOptionsItemSelected 方法。
仅供参考,我添加到菜单中的所有其他按钮(搜索、刷新等)都有效,并且调用了 onOptionsItemSelected。
如果您在抽屉 activity 中实现 onOptionsItemSelected,它将不再在片段中被调用,除非您在 activity 中 return false。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.home:
return false; //The fragment will take care of it
default:
break;
}
return false;
}
希望对您有所帮助!
更新
您也可以尝试开始一个新的 activity 并将该片段加载到 activity 中,正如我所说的。由于您已经通过 Bundle 将数据传递给您的子片段,因此您可以对 activity.
执行相同的操作
Intent intent = new Intent(getActivity(), NewActivity.class);
Bundle bundle = new Bundle();
bundle.putWhatever(key, value); //There's no such method, just a generalization
intent.putExtras(bundle);
startActivity(intent);
标题几乎是不言自明的。
架构:
- 我有扩展 AppCompatActivity 的 Main activity。
- 我还有一个抽屉布局。此菜单的每个选项都会打开一个片段。
- 每个片段都有自己的菜单布局,通过 setHasOptionsMenu(true) 和自己的按钮。他们菜单的主页按钮仍然是打开抽屉布局的入口。
- 其中一个片段有一个项目列表,当单击其中一个项目时,将打开一个新的 child 片段。 (问题出在这里)我希望这个 child 片段能够通过单击其工具栏上的向上图标向上导航至其 parent。
我在替换片段之前禁用了抽屉切换并设置了 Home As Up 指示器:
mDrawerToggle.setDrawerIndicatorEnabled(false);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
actionBar.setHomeAsUpIndicator(R.drawable.ic_arrow_back_white_24dp);
actionBar.setDisplayHomeAsUpEnabled(true);
然后,当点击UP图标时,没有任何反应。我调试了它并且没有调用 onOptionsItemSelected 方法。
仅供参考,我添加到菜单中的所有其他按钮(搜索、刷新等)都有效,并且调用了 onOptionsItemSelected。
如果您在抽屉 activity 中实现 onOptionsItemSelected,它将不再在片段中被调用,除非您在 activity 中 return false。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.home:
return false; //The fragment will take care of it
default:
break;
}
return false;
}
希望对您有所帮助!
更新
您也可以尝试开始一个新的 activity 并将该片段加载到 activity 中,正如我所说的。由于您已经通过 Bundle 将数据传递给您的子片段,因此您可以对 activity.
执行相同的操作Intent intent = new Intent(getActivity(), NewActivity.class);
Bundle bundle = new Bundle();
bundle.putWhatever(key, value); //There's no such method, just a generalization
intent.putExtras(bundle);
startActivity(intent);