如何解决如何使用NavController为每个片段充气和收听自定义菜单?
我的应用程序按以下顺序使用NavController:
-
MainActivity 是 NavController 的容器,它具有自己的菜单。
-
住所目的地是 FragmentMisSecuencias
-
FragmentMisSecuencias 调用导航事件,以 FragmentSecuencia
FragmentSecuencia 需要一个自定义菜单来显示更改Fragment内容的选项。
我设法通过在 MainActivity 上添加 destinationChangedListener 来更改菜单,但是它不允许 FragmentSecuencia 管理 onOptionsItemSelected 方法。
MainActivity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
final NavigationView navigationView = findViewById(R.id.nav_view);
...
final NavController navController = Navigation.findNavController(this,R.id.nav_host_fragment);
...
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
@Override
public void onDestinationChanged(@NonNull NavController controller,@NonNull NavDestination destination,@Nullable Bundle arguments) {
switch (destination.getId()) {
case R.id.nav_dst_secuencia:
menu.clear();
getMenuInflater().inflate(R.menu.menu_prueba,menu);
break;
}
}
});
...
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show();
return false;
}
FragmentSecuencia
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.mnu_prueba:
Toast.makeText(getContext(),"Menú prueba",Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
Toast输出是MenuItem标题,而不是“MenúPrueba”消息。我知道这是因为未调用 FragmentSecuencia 的onOptionsItemSelected。
我想知道在每个NavController目标上实现自定义菜单并从其自己的Class处理它的正确方法
解决方法
根据Fragments guide for adding items to the app bar,片段具有特定的API,仅当该片段可见时才用于扩展菜单项:您不应为此使用OnDestinationChangedListener
。
请确保:
- 您的片段调用
setHasOptionsMenu(true)
中的onCreate()
- 在片段中覆盖
onCreateOptionsMenu()
,以使菜单膨胀 - 确保您的活动调用
super.onOptionsItemSelected()
,将所选菜单项传递给片段以进行处理
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。