将最新的导航组件与 一起使用BottomNavigationView,NavController现在默认保存和恢复选项卡的状态:
作为此更改的一部分,onNavDestinationSelected()、BottomNavigationView.setupWithNavController() 和 NavigationView.setupWithNavController() 的 NavigationUI 方法现在会自动保存和恢复弹出目的地的状态,从而无需更改任何代码即可支持多个返回堆栈。当使用带有片段的导航时,这是与多个返回堆栈集成的推荐方法。
这很棒!现在,切换选项卡将为您提供最后查看的堆栈。
但是,如果用户重新选择一个选项卡,假设他们已经离开Home -> Detail Page A -> Detail Page B,然后他们选择Home希望返回到默认视图的选项卡,他们仍然会看到Detail Page B。
似乎讨论的一部分是处理问题跟踪器中提到的“重新选择选项卡”行为,但我无法找出实现此目的的推荐方法。
NavigationAdvancedSample中包含的所有内容是:
val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_nav)
bottomNavigationView.setupWithNavController(navController)
// Setup the ActionBar with navController and 3 top level destinations
appBarConfiguration = AppBarConfiguration(
setOf(R.id.titleScreen, R.id.leaderboard, R.id.register)
)
setupActionBarWithNavController(navController, appBarConfiguration)
Run Code Online (Sandbox Code Playgroud)
这只是恢复之前的状态,如发行说明中所述。
我们如何检查是否再次点击导航栏项目并清除后堆栈?
android android-navigation bottomnavigationview android-bottomnav android-architecture-navigation
我正在努力实现上述设计。我可以更改图标,但无法更改底部文本。我使用材质底部导航栏
我通过为每个图标实现单独的选择器可绘制对象来实现图标更改。有什么方法可以对导航标题做同样的事情吗?
MainActivity.class
public class MainActivity extends AppCompatActivity {
BottomNavigationView navView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
navView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_home, R.id.navigation_saved, R.id.navigation_applied, R.id.navigation_profile, R.id.navigation_more)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
}
Run Code Online (Sandbox Code Playgroud)
活动主文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:paddingTop="?attr/actionBarSize">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content" …Run Code Online (Sandbox Code Playgroud) android material-design bottomnavigationview android-bottomnav android-bottom-nav-view
我正在使用底部导航构建一个带有 3 个菜单的 Android 应用程序。我使用底部导航活动在 Android Studio 中创建了新项目。
我将该片段重命名为:
InfoFragment.kt
DetectFragment.kt
AboutFragment.kt
将布局重命名src/main/res/layout为:
fragment_info.xml
fragment_detect.xml
fragment_about.xml
将菜单重命名src/main/res/menu为:
navigation_info
navigation_detect
navigation_about
在fragment_about.xml我添加了一个按钮buttonGoToFAQ来导航到fragment_faq 这样的代码AboutFragment.kt
buttonGoToFAQ.setOnClickListener {
val action = AboutFragmentDirections.actionFAQ()
Navigation.findNavController(it).navigate(action)
}
Run Code Online (Sandbox Code Playgroud)
单击 BottomNavigationView 菜单 或 后navigation_info,navigation_detect然后单击navigation_about菜单返回,BottomNavigationView 上的选定菜单不会更改。
看这张图。
我想要的是应该选择菜单navigation_about而不是其他菜单。
我已经尝试过覆盖fun onStart()并fun onResume()进入FAQFragment.kt但无济于事。
nav_view是我的 BottomNavigationView。
override fun onStart() {
super.onStart()
(requireActivity().findViewById<View>(R.id.nav_view) as BottomNavigationView).selectedItemId …Run Code Online (Sandbox Code Playgroud) 以下是我当前BottomNavigationView的XML.目前,所有三个图标drawable都是具有相同颜色的未填充图标.我希望能够在选择该状态时呈现图标的填充版本,并且可能更改颜色以使其显然是当前图标状态.以下图片是我的意思的一个例子.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_favorites"
android:enabled="true"
android:icon="@drawable/icon_flyer"
android:title="Flyer"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_schedules"
android:enabled="true"
android:icon="@drawable/icon_list"
android:title="List"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_music"
android:enabled="true"
android:icon="@drawable/icon_contact"
android:title="Contact"
app:showAsAction="ifRoom" />
</menu>
Run Code Online (Sandbox Code Playgroud) 我有一个带有三个选项卡的底部导航(主页,仪表板,通知).每个底部导航选项卡都是一个片段.第一个标签即.主片段包含另外的顶部导航标签,其具有四个标签(标签1,标签2,标签3,标签4).
问题
当我直接从" 主页"选项卡导航到" 通知"选项卡并返回" 主页"选项卡时,Tab1 /选择了以前选择的选项卡(顶部导航选项卡),未加载选项卡的内容.
当我从选项卡1(主页片段选项卡)一直滑动选项卡到" 通知"选项卡并向后滑动时,在到达选项卡4时,未加载选项卡的内容,并且在第一次从选项卡4滑动到选项卡3时,滑动不会拿到表3.选项卡指示器只需移动一点,然后在第二次滑动时按预期方式转到选项卡3.
该应用程序包含大量代码,因此我只需将完整代码链接到Github.
这里有我的代码快速参考
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
NavigationView navigationView;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
viewPager.setCurrentItem(0);
return true;
case R.id.navigation_dashboard:
viewPager.setCurrentItem(1);
return true;
case R.id.navigation_notifications:
viewPager.setCurrentItem(2);
return true;
}
return false;
}
}; …Run Code Online (Sandbox Code Playgroud) tabs android tabnavigator android-fragments android-bottomnav
我正在查看Material 的入门设计指南。我想知道我应该如何复制这种导航。它似乎包含了一个特殊的底部标签栏和 viewpager。没有 viewpager 的滑动功能,只有两个按钮倾斜到底部标签栏的两侧。
android tabbar android-viewpager bottomnavigationview android-bottomnav
我正在尝试使用 Jetpack Compose + Jetpack Navigation 实现以下屏幕流程:
实际上,我可以编写两个单打案例:
我无法编写整个问题的代码。事实上,我对 NavHost 的管理有疑问。在第一种情况(SplashScreen -> HomeScreen)中,我需要在高范围内调用 NavHost:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
//init the Navigation Controller for screen navigation
val navController = rememberNavController()
//setup the Navigation Graph
SetupNavGraph(navController)
Run Code Online (Sandbox Code Playgroud)
而在第二种情况下,我需要在可组合项innerPadding的范围内调用它Scaffold:
fun MainScreen(navController: NavHostController) {
Scaffold(
bottomBar = {
BottomNavBar(navController)
}
) { //innerPadding scope
//setup the Navigation Graph
SetupNavGraph(navController)
}
}
Run Code Online (Sandbox Code Playgroud)
请假设该SetupNavGraph()函数按预期工作(调用 …
android android-bottomnav android-jetpack-navigation android-jetpack-compose
有什么方法可以从 BottomNavigationItem 中删除此填充吗?
如果我有非常大的文本,我必须使用 ResponsiveText 来管理它,但这不是我的意图。我需要的是它的左侧和右侧都没有侧边距/边距,以便占据尽可能多的空间。
我的代码:
@Composable
fun BottomNavBar(
backStackEntryState: State<NavBackStackEntry?>,
navController: NavController,
bottomNavItems: List<NavigationItem>
) {
BottomNavigation(
backgroundColor = DarkGray.copy(alpha = 0.6f),
elevation = Dimen0,
modifier = Modifier
.padding(Dimen10, Dimen20, Dimen10, Dimen20)
.clip(RoundedCornerShape(Dimen13, Dimen13, Dimen13, Dimen13))
) {
bottomNavItems.forEach { item ->
val isSelected = item.route == backStackEntryState.value?.destination?.route
BottomNavigationItem(
icon = {
Icon(
painter = painterResource(id = item.icon.orZero()),
contentDescription = stringResource(id = item.title)
)
},
label = {
ResponsiveText(
text = stringResource(id = item.title),
textStyle = TextStyle14, …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的应用程序,由三个片段和一个底部导航栏组成,是通过使用 Android Studio 中的“新项目 -> 底部导航活动”创建的。第一个片段包含一个按钮,它应该将我带到第二个片段,就像单击底部导航栏的中间按钮一样。

有没有一个“标准”的方法来做到这一点?
我努力了:
launch(...)导航组件,该组件似乎使用自己的后堆栈启动片段并破坏底部导航。setSelectedItemId(...),这要么导致异常,要么以不同的方式破坏底部导航。android bottomnavigationview android-bottomnav android-architecture-navigation
在我的应用程序中,我使用Jetpack Navigation和BottomNavigationView. 我有 4 个片段:主页、搜索、通知、个人资料,当我在主页片段中时,我再次单击底部导航视图中的主页项目,它会重新创建片段。我进行了搜索,但主要的答案是针对那些不使用喷气背包导航的人。
(顺便说一句,我只希望当我已经在该片段中时不重新创建片段,如果我不在该片段中,则可以重新创建)
以下是我的设置:
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView_mainActivity) as NavHostFragment
navController = navHostFragment.navController
binding.bottomNavView.setupWithNavController(navController)
Run Code Online (Sandbox Code Playgroud)
android android-fragments fragmentmanager android-bottomnav android-jetpack-navigation