我正在尝试使用BottomNavigationViewAndroid 导航来创建一个包含三个片段的标准选项卡式应用程序:StatusFragment、MapFragment和AlertsFragment。
我的main_activity.xmlaFragmentContainerView和BottomNavigationView定义如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.main.MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/mainNavHostFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/bottomNavigationView"
app:defaultNavHost="true"
app:navGraph="@navigation/main_nav_graph" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNavigationView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:menu="@menu/main_menu" />
</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
我的main_nav_graph.xml:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_nav_graph"
app:startDestination="@id/mainActivity">
<fragment
android:id="@+id/statusFragment"
android:name="<redacted>.ui.status.StatusFragment"
android:label="StatusFragment" />
<fragment
android:id="@+id/mapFragment"
android:name="<redacted>.ui.map.MapFragment"
android:label="MapFragment" />
<fragment
android:id="@+id/alertsFragment"
android:name="<redacted>.ui.alert.AlertsFragment"
android:label="AlertsFragment" />
<activity
android:id="@+id/mainActivity"
android:name="<redacted>.ui.main.MainActivity"
android:label="main_activity" …Run Code Online (Sandbox Code Playgroud) android kotlin android-navigation android-architecture-navigation
我试图在用户可以从欢迎页面显示欢迎消息时在仪表板上向用户显示欢迎消息。因此,在仪表板的路线中,我定义了一个可选参数。
无需任何参数即可访问它(因为它是可选的),但当我添加一个时,它就不再工作了。
composable(Routes.welcome) {
WelcomeScreen {
navController.navigate("dashboard?isWelcome={true}")
}
}
composable(
"dashboard?isWelcome={isWelcome}}",
arguments = listOf(
navArgument("isWelcome") {
type = NavType.BoolType
}
)
) {
val isFromWelcome = it.arguments?.getBoolean("isWelcome") ?: false
...
}
Run Code Online (Sandbox Code Playgroud)
我的错误是:
Navigation destination that matches request NavDeepLinkRequest{ uri=android-app://androidx.navigation/dashboard?isWelcome={true} } cannot be found in the navigation graph
Run Code Online (Sandbox Code Playgroud)
谢谢你的建议 :)
android android-jetpack android-architecture-navigation android-jetpack-compose
我已经看过这个问题:FragmentContainerView using findNavController关于这个问题。但我仍然无法解决问题。它永远不会打开其他片段。我想也许是因为视图绑定,但我尝试在不使用视图绑定的情况下再次执行此操作。还没开啊
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var navController: NavController
private lateinit var navHostFragment: NavHostFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.main_nav_host_fragment) as NavHostFragment
navController = navHostFragment.navController
binding.bottomNavigationView.setupWithNavController(navController)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.home -> {
navHostFragment.navController.popBackStack()
return true
}
}
return super.onOptionsItemSelected(item)
}
}
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"
xmlns:tools="http://schemas.android.com/tools" …Run Code Online (Sandbox Code Playgroud) android kotlin android-studio android-architecture-navigation
我有一个带有 navHost 片段的 PinCreateActivity 和 2 个片段 PinSetup 和 PinCreate 片段。
当 Activity 启动时,PinSetup 是默认片段,之后通过单击按钮导航到 PinCreate 片段。我想要的是来自 PinCreate 片段,当用户单击后退按钮时,不要像 PinCreateActivity 那样转到 PinSetup 并导航到后退堆栈。所以我想当我从 PinSetup 导航到 PinCreate 片段时,我必须从 backStack 中删除 PinSetup。我怎样才能做到这一点?
导航图.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pin_create_nav_graph"
app:startDestination="@id/pinSetupFragment">
<fragment
android:id="@+id/pinSetupFragment"
android:name="com.example.ui.fragments.pin.PinSetupFragment"
android:label="Create PIN"
tools:layout="@layout/fragment_pin_setup" >
<action
android:id="@+id/action_pinSetupFragment_to_pinCreateFragment"
app:destination="@id/pinCreateFragment" />
</fragment>
<fragment
android:id="@+id/pinCreateFragment"
android:name="com.example.ui.fragments.pin.PinCreateFragment"
android:label="Your PIN"
tools:layout="@layout/fragment_pin_create" />
</navigation>
Run Code Online (Sandbox Code Playgroud)
Pin创建活动
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
...
navController = Navigation.findNavController(this, R.id.pin_create_host_fragment)
// onClick
navController.navigate(R.id.action_pinSetupFragment_to_pinCreateFragment)
}
Run Code Online (Sandbox Code Playgroud) android-fragments kotlin android-architecture-navigation android-jetpack-navigation android-navigation-graph
我想创建一个单一活动应用程序,为简单起见,它只包含以下屏幕:登陆、登录、注册、主页、个人资料。主页和个人资料屏幕仅在用户登录后才可见,并且属于导航抽屉。
不幸的是,我想到的是用 nav_graph_1 创建一个活动,其中包含以下目的地:登陆、登录、注册。然后使用 nav_graph_2(主页和个人资料目的地)创建另一个活动,其中将包含导航抽屉的所有设置:例如setupActionBarWithNavController,带有 nav_graph_2 和抽屉的 appBarConfiguration。
是否可以在单个活动应用程序中实现上述内容以及如何实现?
android navigation-drawer android-architecture-navigation android-jetpack-navigation android-navigation-graph
我需要找出用户从哪个片段切换到另一个片段。我认为我应该使用片段名称,但如何获得该名称?还是我的方法不太可靠,还有其他选择?
PS:我使用NavHostFragmentKotlin
android android-fragments kotlin android-architecture-navigation
我的应用程序从NewAdFragment这个片段开始,里面有一个按钮,允许用户选择类别,当用户单击该按钮时,我将通过ChooserFragment传递类别列表作为参数将他导航到,这个片段中有 RecyclerView ,它显示类别。
我想要什么?我希望当用户从 RecyclerView 中选择一个项目时,它必须返回NewAdFragment特定的数据。
我可以用很多方法解决这个问题,但也许导航组件库中已经存在一种方法。
最好的方法是什么?