使用带有 Android Navigation UI 库的 BottomNavigationView 进行导航时,从操作栏中删除向上按钮
Remove up button from action bar when navigating using BottomNavigationView with Android Navigation UI library
我创建了一个小型应用程序,其中包含三个片段,用于通过 BottomNavigationView 进行顶级导航。如果您启动该应用程序并单击底部导航栏上的导航按钮,您会在操作栏中看到一个向上按钮。这是 activity:
的代码
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
setSupportActionBar(toolbar)
val navController = navHostFragment.findNavController()
setupActionBarWithNavController(this, navController)
setupWithNavController(bottomNav, navController)
}
override fun onSupportNavigateUp(): Boolean
= findNavController(navHostFragment).navigateUp()
}
这是结果的屏幕截图。该应用程序在主屏幕上启动,我所做的只是单击 BottomNavigationView 中的配置文件按钮。
我试过听 BottomNavigationView 的项目选择并使用不同的 NavOptions 手动导航无济于事。当用户使用 BottomNavigationView 导航时,我们可以做些什么来避免在操作栏中显示向上按钮?
我遇到了同样的问题,我找到了一种使用 NavController.addOnNavigatedListener 获取当前片段的方法,所以我在 Activity 中应用了以下逻辑] 现在对我有用
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
val navHost = supportFragmentManager
.findFragmentById(R.id.navHostFragment) as NavHostFragment
navHost.navController.addOnNavigatedListener { _, destination ->
val showButton = showUpButton(destination.id)
//Here occurs the magic
supportActionBar?.setDisplayShowHomeEnabled(showButton)
supportActionBar?.setDisplayHomeAsUpEnabled(showButton)
}
}
//Check according to your convenience which fragment id
//should show or hide the "Up Button"
private fun showUpButton(id: Int): Boolean {
return id != R.id.your_home_fragment && id != R.id.your_list_fragment
&& id != R.id.your_profile_fragment
}
这是我的项目...
不知道是不是最好的选择,如果有人有更好的建议,欢迎提出来
用这个代替 setupWithNavController
:
navController.addOnNavigatedListener(new NavController.OnNavigatedListener() {
@Override
public void onNavigated(@NonNull NavController controller, @NonNull NavDestination destination) {
toolbar.setTitle(destination.getLabel());
}
});
或 Kotlin 中的等效项。
setupWithNavController
唯一做的就是添加一个侦听器来更改工具栏标题,并创建向上按钮。如果您不需要向上按钮,只需添加一个仅更改工具栏标题的侦听器。
从 1.0.0-alpha07 开始,您可以使用 AppBarConfiguration
来配置该行为。
AppBarConfiguration
有一个 Builder 构造函数,所以你可以创建一个新的 Builder
和一组特定的顶级目的地,由他们的 id
引用(这个 id
是您在导航布局上设置的那个)。
新建AppBarConfiguration
:
val appBarConfiguration = AppBarConfiguration
.Builder(
R.id.navigationHomeFragment,
R.id.navigationListFragment,
R.id.navigationProfileFragment)
.build()
然后,您需要调用 setupActionBarWithNavController(this, navController, appBarConfiguration)
而不是 setupActionBarWithNavController(this, navController)
这是处理顶部导航行为的正确方法。
如果您正在使用 NavigationUI.setupWithNavController
check out onNavDestinationSelected
.
在您的底部导航视图 menu.xml
中,将 android:menuCategory="secondary"
添加到相应的 MenuItem
:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/profileFragment"
android:icon="@drawable/bottom_nav_icon_profile"
android:menuCategory="secondary"
android:title="@string/profile" />
您可以将导航图标设置为空,或仅更改某些目的地的图标
例如:
1) 在 Kotlin 中:
navController.addOnDestinationChangedListener { _, destination, _ ->
toolbar.title = destination.label
toolbar.navigationIcon = null
}
2) 在Java:
hostFragment.getNavController().addOnDestinationChangedListener(new OnDestinationChangedListener() {
public final void onDestinationChanged(@NotNull NavController controller, @NotNull NavDestination destination, @Nullable Bundle arguments) {
toolbar.setTitle(destination.getLabel());
toolbar.setNavigationIcon(null);
}
});
在 Java 这对我有用:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
navController = Navigation.findNavController(this, R.id.nav_host_fragment);
AppBarConfiguration appBarConfiguration = new AppBarConfiguration
.Builder(navController.getGraph())
.build();
NavigationUI.setupWithNavController(toolbar, navController, appBarConfiguration);
navController.addOnDestinationChangedListener((controller, destination, arguments) -> {
toolbar.setTitle(destination.getLabel());
toolbar.setNavigationIcon(null);
});
我创建了一个小型应用程序,其中包含三个片段,用于通过 BottomNavigationView 进行顶级导航。如果您启动该应用程序并单击底部导航栏上的导航按钮,您会在操作栏中看到一个向上按钮。这是 activity:
的代码class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
setSupportActionBar(toolbar)
val navController = navHostFragment.findNavController()
setupActionBarWithNavController(this, navController)
setupWithNavController(bottomNav, navController)
}
override fun onSupportNavigateUp(): Boolean
= findNavController(navHostFragment).navigateUp()
}
这是结果的屏幕截图。该应用程序在主屏幕上启动,我所做的只是单击 BottomNavigationView 中的配置文件按钮。
我试过听 BottomNavigationView 的项目选择并使用不同的 NavOptions 手动导航无济于事。当用户使用 BottomNavigationView 导航时,我们可以做些什么来避免在操作栏中显示向上按钮?
我遇到了同样的问题,我找到了一种使用 NavController.addOnNavigatedListener 获取当前片段的方法,所以我在 Activity 中应用了以下逻辑] 现在对我有用
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
val navHost = supportFragmentManager
.findFragmentById(R.id.navHostFragment) as NavHostFragment
navHost.navController.addOnNavigatedListener { _, destination ->
val showButton = showUpButton(destination.id)
//Here occurs the magic
supportActionBar?.setDisplayShowHomeEnabled(showButton)
supportActionBar?.setDisplayHomeAsUpEnabled(showButton)
}
}
//Check according to your convenience which fragment id
//should show or hide the "Up Button"
private fun showUpButton(id: Int): Boolean {
return id != R.id.your_home_fragment && id != R.id.your_list_fragment
&& id != R.id.your_profile_fragment
}
这是我的项目...
不知道是不是最好的选择,如果有人有更好的建议,欢迎提出来
用这个代替 setupWithNavController
:
navController.addOnNavigatedListener(new NavController.OnNavigatedListener() {
@Override
public void onNavigated(@NonNull NavController controller, @NonNull NavDestination destination) {
toolbar.setTitle(destination.getLabel());
}
});
或 Kotlin 中的等效项。
setupWithNavController
唯一做的就是添加一个侦听器来更改工具栏标题,并创建向上按钮。如果您不需要向上按钮,只需添加一个仅更改工具栏标题的侦听器。
从 1.0.0-alpha07 开始,您可以使用 AppBarConfiguration
来配置该行为。
AppBarConfiguration
有一个 Builder 构造函数,所以你可以创建一个新的 Builder
和一组特定的顶级目的地,由他们的 id
引用(这个 id
是您在导航布局上设置的那个)。
新建AppBarConfiguration
:
val appBarConfiguration = AppBarConfiguration
.Builder(
R.id.navigationHomeFragment,
R.id.navigationListFragment,
R.id.navigationProfileFragment)
.build()
然后,您需要调用 setupActionBarWithNavController(this, navController, appBarConfiguration)
setupActionBarWithNavController(this, navController)
这是处理顶部导航行为的正确方法。
如果您正在使用 NavigationUI.setupWithNavController
check out onNavDestinationSelected
.
在您的底部导航视图 menu.xml
中,将 android:menuCategory="secondary"
添加到相应的 MenuItem
:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/profileFragment"
android:icon="@drawable/bottom_nav_icon_profile"
android:menuCategory="secondary"
android:title="@string/profile" />
您可以将导航图标设置为空,或仅更改某些目的地的图标 例如:
1) 在 Kotlin 中:
navController.addOnDestinationChangedListener { _, destination, _ ->
toolbar.title = destination.label
toolbar.navigationIcon = null
}
2) 在Java:
hostFragment.getNavController().addOnDestinationChangedListener(new OnDestinationChangedListener() {
public final void onDestinationChanged(@NotNull NavController controller, @NotNull NavDestination destination, @Nullable Bundle arguments) {
toolbar.setTitle(destination.getLabel());
toolbar.setNavigationIcon(null);
}
});
在 Java 这对我有用:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
navController = Navigation.findNavController(this, R.id.nav_host_fragment);
AppBarConfiguration appBarConfiguration = new AppBarConfiguration
.Builder(navController.getGraph())
.build();
NavigationUI.setupWithNavController(toolbar, navController, appBarConfiguration);
navController.addOnDestinationChangedListener((controller, destination, arguments) -> {
toolbar.setTitle(destination.getLabel());
toolbar.setNavigationIcon(null);
});