如何解决要在工具栏项上进行片段过渡,请单击
当用户单击工具栏上的设置按钮时,我想过渡到设置片段,但是我一直在尝试从onOptionsItemSelected()进行片段过渡,但是我无法做到这一点。 我也是一个导航控制器,但是我找不到从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's Navigation component,则不应使用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中
toolbar_menu.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>
请注意,我们为菜单项指定了setting_fragment
ID,并在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();
}
有关更多信息,请关注Update UI components with NavigationUI
快乐编码!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。