[英]Want to make a fragment transition on an toolbar item click
当用户单击工具栏上的设置按钮时,我想转换到设置片段,但是我一直在尝试从 onOptionsItemSelected() 进行片段转换,但我无法做到。 我也是导航 controller,但我找不到从 onOptionsSelected() 访问它以进行转换的方法,我将其用于所有其他片段转换。
你能告诉我我做错了什么吗?
谢谢
public class MainActivity extends AppCompatActivity {
BottomNavigationView bottomNavigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setUpNavigation();
}
//bottom bar navigation set up
public void setUpNavigation(){
bottomNavigationView = findViewById(R.id.bottom_navigation);
NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
NavigationUI.setupWithNavController(bottomNavigationView, navHostFragment.getNavController());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.nav_settings:
Toast.makeText(getApplicationContext(), "Settings Selected", Toast.LENGTH_SHORT).show();
Log.d("debug","fragment: action settings was clicked");
getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, new SettingsFragment()).addToBackStack(null).commit();
return true;
}
return super.onOptionsItemSelected(item);
}
}
如果您使用的是Android Jetpack 的导航组件,则不应使用 FragmentMangaer 导航到片段。
找到navController如下-
//taking as a global variable here
NavController navController;
public void setUpNavigation(){
//find NavController
navController = Navigation.findNavController(this, R.id.nav_host_fragment);
//setting up Toolbar with NavController
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
//setting up bottomNavigationView
bottomNavigationView = findViewById(R.id.bottom_navigation);
NavigationUI.setupWithNavController(bottomNavigationView, navController);
}
如果您在查找 navController 时注意到R.id.nav_host_fragment
,它将与activity_main.xml
下的主机片段的 id 相同,如下所示 -
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="?attr/actionBarSize"
app:defaultNavHost="true"
app:navGraph="@navigation/mobile_navigation" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:layout_gravity="bottom"
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/windowBackground"
app:menu="@menu/bottom_nav_menu" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
要将目标工具栏菜单项绑定到目标,您只需将与片段相同的 id 放入 navGraph
工具栏_菜单.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
...
<item
android:id="@+id/setting_fragment"
android:icon="@drawable/ic_details"
android:title="@string/details" />
</menu>
mobile_navigation.xml (navGraph)
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
... >
...
<fragment android:id="@+id/setting_fragment"
android:label="@string/setting"
android:name="com.example.android.myapp.SettingFragment" />
</navigation>
请注意,我们将 id setting_fragment
赋予菜单项并在 navGraph 中设置片段。
那么您可以按如下方式覆盖onOptionsItemSelected
-
@Override
public boolean onOptionsItemSelected(MenuItem item) {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.onNavDestinationSelected(item, navController)
|| super.onOptionsItemSelected(item);
}
如果您不使用样式作为 NoActionBar,则无需在活动onCreate()
中创建工具栏,因为 android 将为您创建工具栏-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//no need to create a toolbar if style is not NoActionBar
//Toolbar toolbar = findViewById(R.id.toolbar);
//setSupportActionBar(toolbar);
setUpNavigation();
}
有关更多信息,请关注使用 NavigationUI 更新 UI 组件
快乐编码!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.