我使用底部导航栏创建了一个应用程序,并使用Google的高级导航示例添加了四个不同的导航图
此后,我添加了名为设置的第五张图,该图具有设置片段以及全局操作
我在前四个图的每个图上都添加了一个包含项
当我执行类似findNavController(R.id.container).navigate(SettingsDirections.showSettings())
之类的操作时,由于找不到目标位置或操作,应用程序崩溃了
但是当我在每个图内复制fragment
和全局图action
并调用上面的代码时(具有该图的方向)
答案 0 :(得分:4)
似乎include标记实际上并没有包含所有的nav图,包括全局操作
所以如果有人想做类似的事情,这就是我的做法
首先,我更新了设置导航,以包含一个虚拟操作来显示如下设置:
<?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/settings"
app:startDestination="@+id/settings_dest">
<include app:graph="@navigation/questions" />
<!--this is just so safeargs will create a SettingsNavigation.showSettings it is never actually used-->
<action
android:id="@+id/show_settings"
app:destination="@id/settings_dest" />
<fragment
android:id="@+id/settings_dest"
android:name="com.example.app.ui.fragments.SettingsFragment"
android:label="@string/settings"
tools:layout="@layout/fragment_settings" >
<argument
app:argType="com.example.app.ui.model.SettingsProfile"
android:name="profile"
app:nullable="false"/>
</fragment>
</navigation>
,然后在要使用show_settings动作的每个导航图上,都将包括以下内容:
<include app:graph="@navigation/settings" />
<action
android:id="@+id/show_settings"
app:destination="@id/settings"
app:enterAnim="@anim/fade_in"
app:exitAnim="@anim/fade_out"
app:popEnterAnim="@anim/fade_in"
app:popExitAnim="@anim/fade_out" />
现在,当我想使用路线去设置时,我会这样
findNavController().navigate(SettingsDirections.showSettings(profile))
这将使用在我的settings.xml
中创建的说明在当前的导航控制器中执行操作
重要的是,包含文件中的操作ID和包含它的文件的操作ID必须相同
答案 1 :(得分:0)
我在设置默认动画时创建了扩展功能
fun View.navigate(id: Int, navOptions: NavOptions? = null){
var updatedNavOptions = navOptions
if(updatedNavOptions == null){
updatedNavOptions = navOptions {
anim {
enter = R.anim.slide_in_right
exit = R.anim.slide_out_left
popEnter = R.anim.slide_in_left
popExit = R.anim.slide_out_right
}
}
}
this.findNavController().navigate(id, null, updatedNavOptions)
}
在我的片段中,只需这样做:
my_view.click { view?.navigate(R.id.how_referral_program_works) }