标签: android-navigation

在我的情况下,如何修复“无法从当前目的地找到导航操作/目的地”错误?

我在用bottom navigation

在切换的屏幕中,还有打开dialog fragment.

我也为此使用了导航。

这是因为,一旦dialog完成,data就必须传递到打开对话框的屏幕。

我用的safe args是这个。

但我遇到了与标题相同的错误。

我知道错误在哪里,但我不知道为什么会发生。

根据Stack Overflow上的搜索,有人遇到了和我一样的问题,但似乎并不是一个确切的解决方案,因为情况不同。

导航图

<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/nav_graph"
    app:startDestination="@id/calendar">
    <fragment
        android:id="@+id/calendar"
        android:name="com.example.writeweight.fragment.CalendarFragment"
        android:label="fragment_calendar"
        tools:layout="@layout/fragment_calendar" >
    </fragment>
    <fragment
        android:id="@+id/list"
        android:name="com.example.writeweight.fragment.WorkoutListFragment"
        android:label="fragment_workout_list"
        tools:layout="@layout/fragment_workout_list" />
    <fragment
        android:id="@+id/write"
        android:name="com.example.writeweight.fragment.WritingRoutineFragment"
        android:label="WritingRoutineFragment"
        tools:layout="@layout/fragment_writing_routine">
        <action
            android:id="@+id/action_write_to_bodyPartDialog"
            app:destination="@id/bodyPartDialog" />
        <argument
            android:name="title"
            app:argType="string"
            android:defaultValue="Write" />
    </fragment>
    <dialog
        android:id="@+id/bodyPartDialog"
        android:name="com.example.writeweight.fragment.BodyPartDialogFragment"
        android:label="BodyPartDialogFragment"
        tools:layout="@layout/fragment_body_part_dialog">
        <action
            android:id="@+id/action_bodyPartDialog_to_write"
            app:destination="@id/write">
        </action>
    </dialog>
</navigation>
Run Code Online (Sandbox Code Playgroud)

主要活动

class MainActivity : AppCompatActivity() {
    private lateinit var bottomNav: BottomNavigationView
    private …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-navigation android-safe-args

3
推荐指数
1
解决办法
6977
查看次数

资源目录导航无效

在添加导航目录时显示错误无效的资源目录.

处理命令'〜/ Android/Sdk/builds-tools/27.0.3/aapt'以退出值1结束.

的build.gradle

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.crushcoder.testapp"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    implementation 'android.arch.lifecycle:extensions:1.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
Run Code Online (Sandbox Code Playgroud)

我在目录res/navigation/nav_graph.xml下创建了导航文件

android android-navigation android-architecture-components android-architecture-navigation

2
推荐指数
1
解决办法
310
查看次数

在具有透明背景的片段上呈现片段

我正在使用喷气背包导航从片段过渡到细节片段。

我需要帮助在显示它的片段呈现细节片段。

请参阅下面的照片以了解我想要实现的目标:

埃菲尔铁塔

我还在导航图中的动画上使用基本的淡入/淡出作为输入退出。

这是我得到的结果:

呈现视图的结果未显示在详细视图中

如何设置过渡以便细节片段显示在呈现视图上?

这是我所有的进展:

底部导航菜单

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
            android:id="@+id/fragment_tab1"
            android:title="Tab 1"/>

    <item
            android:id="@+id/fragment_tab2"
            android:title="Tab 2"/>

    <item
            android:id="@+id/fragment_tab3"
            android:title="Tab 3"/>

</menu>
Run Code Online (Sandbox Code Playgroud)

导航图

<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/nav_graph"
            app:startDestination="@id/fragment_tab1">
    <fragment android:id="@+id/fragment_tab1" android:name="com.example.navgraphfragmentmodal.Tab1" android:label="fragment_tab1"
              tools:layout="@layout/fragment_tab1">
        <action android:id="@+id/toModal" app:destination="@id/modalFragment"/>
    </fragment>
    <fragment android:id="@+id/fragment_tab2" android:name="com.example.navgraphfragmentmodal.Tab2" android:label="fragment_tab2"
              tools:layout="@layout/fragment_tab2"/>
    <fragment android:id="@+id/fragment_tab3" android:name="com.example.navgraphfragmentmodal.Tab3"
              android:label="fragment_tab3" tools:layout="@layout/fragment_tab3"/>
    <fragment android:id="@+id/modalFragment" android:name="com.example.navgraphfragmentmodal.ModalFragment"
              android:label="fragment_modal" tools:layout="@layout/fragment_modal"/>
</navigation>
Run Code Online (Sandbox Code Playgroud)

主活动.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navHostFragment = supportFragmentManager.findFragmentById(R.id.navigation_host_fragment) as NavHostFragment?
        NavigationUI.setupWithNavController(bottom_navigation_view, navHostFragment!!.navController)

        supportActionBar?.setDisplayShowHomeEnabled(true)
    } …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-navigation android-transitions android-jetpack

2
推荐指数
1
解决办法
1924
查看次数

禁用底部导航控制器中的当前选项卡

我正在使用 Jetpack Navigation 来处理底部导航控制器。效果很好;但是,我正在寻找一种改进用户体验的方法。

是否可以禁用用户当前导航到的选项卡?

我可以“垃圾邮件”底部导航中的当前选项卡,这会不必要地重新加载数据和 UI。如果这种行为(重新点击当前选项卡)是有意的,有没有办法保留片段的状态,以便在导航离开时不会重新创建?

我如何处理底部导航:

navController = NavHostFragment.findNavController(navigation_host_fragment)
NavigationUI.setupWithNavController(bottom_navigation_view, navController)
Run Code Online (Sandbox Code Playgroud)

android kotlin android-navigation android-jetpack

2
推荐指数
1
解决办法
337
查看次数

如何使用android导航组件添加菜单项

我正在尝试向应用程序的工具栏添加一个菜单

我的应用基于单活动多片段

我正在使用导航组件,我的应用程序样式是:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>
Run Code Online (Sandbox Code Playgroud)

我在 MainActivity 的 onCreate 方法中像这样配置 grapp:

appBarConfiguration = AppBarConfiguration(navController.graph)
setupActionBarWithNavController(navController,appBarConfiguration)
Run Code Online (Sandbox Code Playgroud)

我的问题是如何为不同的片段添加不同的自定义菜单项?另外,我添加了后退按钮如何处理它的点击并将其隐藏在第一个片段上?

android menuitem android-navigation

2
推荐指数
1
解决办法
1197
查看次数

Android 导航组件无法与对话框片段一起使用

免责声明:我已经检查了文档,因为2.1.0导航组件支持对话框片段。(https://developer.android.com/jetpack/androidx/releases/navigation#2.1.0

我遇到的错误

DialogFragment尝试从 a 转到my时出现此错误Start Destination

java.lang.IllegalStateException: Fragment PostDistressDialog{829f5d1} (bbbc4926-684b-491b-9772-e0f0ffebe0af)} not associated with a fragment manager.

PostDistressDialog是使用导航组件DialogFragment调用的JournalEntryFragment(可以在下面的地图中看到)。PostDistressDialog不是 的内部类JournalEntryFragment。它属于自己扩展的一类DialogFragment

我的导航图的图片

在此输入图像描述

函数调用 NavController

public class PostDistressDialog extends DialogFragment implements ISaveDatabase {

...

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    if (getArguments()!=null) {

        ...

        // Set up the Alert Dialog
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(getContext());
        alertDialog.setTitle(R.string.distressed_levels);
        alertDialog.setMessage(R.string.distressed_how_feel_post);

        // Inflate and set the layout for …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-navigation android-navigationview

2
推荐指数
1
解决办法
7961
查看次数

在 NavDirections 中找不到 safeargs 参数

我已经实现了一个在 nav_graph 中的片段之间传递的参数,但是当我尝试在原始片段中设置参数时,NavDirections 找不到该参数。

请注意,在尝试传递参数之前,导航工作正常。

如果我执行 Clean Project,我会丢失 NavDirections。如果我进行重建,我将失去论点。

摇篮:应用程序

    //Navigation
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
    apply plugin: "androidx.navigation.safeargs.kotlin"
Run Code Online (Sandbox Code Playgroud)

导航图.xml

    <fragment
        android:id="@+id/destination_home"
        android:name="com.android.joncb.flightlogbook.HomeFragment"
        android:label="@string/lblHome"
        tools:layout="@layout/fragment_home">
        <action
            android:id="@+id/action_home_to_fltHistory"
            app:destination="@id/destination_fltHistory" />
        <action
            android:id="@+id/action_home_to_stats"
            app:destination="@id/destination_statistics" />
        <action
            android:id="@+id/action_home_to_newFlight"
            app:destination="@id/destination_newFlight" />
        <action
            android:id="@+id/action_home_to_fltDetails"
            app:destination="@id/destination_fltDetails" />
        <argument
            android:name="fltData"
            app:argType="string" />
    </fragment>
Run Code Online (Sandbox Code Playgroud)

在我的 Home Fragment 中,我收到错误“Unresolved reference: fltData”

        card_nextFlight.setOnClickListener {
            val actionDetails = HomeFragmentDirections.actionHomeToFltDetails()
            actionDetails.fltData ( flightData.toString())

            Navigation.findNavController(it).navigate(actionDetails)
        }
Run Code Online (Sandbox Code Playgroud)

flightData 是一个数据类

data class FlightDTO(
    var airlineName: String, var faCode: String, var fltNo: String, var aircraft: String,
    var …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-navigation android-safe-args

2
推荐指数
1
解决办法
1421
查看次数

nav_graph 中两个片段之间的共享视图模型

我有一个应用程序,其中有一个活动和大约 29 个片段nav_graph,其中两个片段用于身份验证,我需要使用 a 在这两个片段之间共享数据,shared view model但不与其他片段共享数据。

因此,我创建了我的并使用库的一部分ViewModel在两个片段中实例化了它。viewModels()fragment-ktx

private val viewModel: AuthViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)

但是,一旦我使用导航到第二个片段,findNavController().navigate()我就会丢失其中的所有数据AuthViewModel

AuthViewModel.kt

class AuthViewModel @ViewModelInject constructor(
    private val authRepository: AuthRepository
) : BaseViewModel()
Run Code Online (Sandbox Code Playgroud)

我这里还缺少任何其他步骤吗?

编辑

onViewCreated我正在从该方法访问数据

android android-studio android-navigation android-viewmodel android-architecture-navigation

2
推荐指数
1
解决办法
4182
查看次数

尝试在空对象引用上调用虚拟方法“androidx.navigation.NavGraph androidx.navigation.NavDestination.getParent()”

我创建了一个 Android 应用程序,并从 Gallery 添加了“导航抽屉活动”,我删除并重命名了菜单项。当我单击抽屉活动中的任何菜单项时启动应用程序后,我收到以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.navigation.NavGraph androidx.navigation.NavDestination.getParent()' on a null object reference
        at androidx.navigation.ui.NavigationUI.onNavDestinationSelected(NavigationUI.java:78)
        at androidx.navigation.ui.NavigationUI$3.onNavigationItemSelected(NavigationUI.java:453)
        at com.google.android.material.navigation.NavigationView$1.onMenuItemSelected(NavigationView.java:215)
        at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:834)
        at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
        at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:985)
        at com.google.android.material.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:416)
        at android.view.View.performClick(View.java:7448)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Run Code Online (Sandbox Code Playgroud)

主要活动代码:

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    private lateinit var appBarConfiguration: AppBarConfiguration

    private lateinit var navView: NavigationView

    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initView()
    } …
Run Code Online (Sandbox Code Playgroud)

android android-navigation androidx

2
推荐指数
2
解决办法
1633
查看次数

为什么在导航中切换屏幕时无法获取 null 作为参数?

我使用navigationSafeArgsswitch screenspass data

\n

当在屏幕上选择数据时A,数据在屏幕切换的同时传输。

\n

但是,有时屏幕会在没有任何操作的情况下A切换到屏幕B

\n

null我决定在这种情况下发送。

\n

但我不断收到以下错误:

\n
E/AndroidRuntime: FATAL EXCEPTION: main\n    Process: com.example.lightweight, PID: 9555\n    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)\n     Caused by: java.lang.reflect.InvocationTargetException\n        at java.lang.reflect.Method.invoke(Native Method)\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)\xc2\xa0\n     Caused by: java.lang.reflect.InvocationTargetException\n        at java.lang.reflect.Method.invoke(Native Method)\n        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:54)\n        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:35)\n        at com.example.lightweight.fragment.WriteRoutineFragment.getArgs(WriteRoutineFragment.kt:20)\n        at com.example.lightweight.fragment.WriteRoutineFragment.onViewCreated(WriteRoutineFragment.kt:44)\n        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2985)\n
Run Code Online (Sandbox Code Playgroud)\n

导航.xml

\n
<fragment\n        android:id="@+id/writeRoutine"\n        android:name="com.example.lightweight.fragment.WriteRoutineFragment"\n        android:label="fragment_write_routine"\n        tools:layout="@layout/fragment_write_routine" >\n        <action\n            android:id="@+id/action_writeRoutineFragment_to_workoutListTabFragment"\n            app:destination="@id/workoutListTabFragment" />\n …
Run Code Online (Sandbox Code Playgroud)

android android-navigation android-safe-args android-navigation-graph

2
推荐指数
1
解决办法
2223
查看次数