如何使用 NavController 为每个片段扩充和收听自定义菜单?
How to inflate and listen a custom menu per fragment using NavController?
我的应用程序按以下顺序使用 NavController:
MainActivity 是 NavController 的容器,它有自己的菜单。
首页目的地是 FragmentMisSecuencias
FragmentMisSecuencias 调用导航事件到 FragmentSecuencia
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
。
相反,确保:
- 您的片段在
onCreate()
中调用 setHasOptionsMenu(true)
- 覆盖片段中的
onCreateOptionsMenu()
以扩充菜单
- 确保您的 activity 调用
super.onOptionsItemSelected()
将选定的菜单项传递给片段进行处理
我的应用程序按以下顺序使用 NavController:
MainActivity 是 NavController 的容器,它有自己的菜单。
首页目的地是 FragmentMisSecuencias
FragmentMisSecuencias 调用导航事件到 FragmentSecuencia
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
。
相反,确保:
- 您的片段在
onCreate()
中调用 - 覆盖片段中的
onCreateOptionsMenu()
以扩充菜单 - 确保您的 activity 调用
super.onOptionsItemSelected()
将选定的菜单项传递给片段进行处理
setHasOptionsMenu(true)