如何使用 NavController 为每个片段扩充和收听自定义菜单?

How to inflate and listen a custom menu per fragment using NavController?

我的应用程序按以下顺序使用 NavController:

FragmentSecuencia 需要一个自定义菜单来显示更改片段内容的选项。

我设法通过在 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

相反,确保:

  1. 您的片段在 onCreate()
  2. 中调用 setHasOptionsMenu(true)
  3. 覆盖片段中的 onCreateOptionsMenu() 以扩充菜单
  4. 确保您的 activity 调用 super.onOptionsItemSelected() 将选定的菜单项传递给片段进行处理