标签: android-navigation

返回堆栈和历史堆栈有什么区别?

我正在检查如何使用空的返回堆栈启动活动,并遇到了该android:noHistory属性。它做了我想要的,但我仍然对文档中使用的术语“历史堆栈”感到好奇android:noHistory。我在 API 指南中没有注意到该术语的任何用法(例如任务 和 Back Stack),那么返回堆栈和历史堆栈之间是否有任何区别,或者它们只是同一件事?

更新

到目前为止,参考文献中使用了三个术语:

历史堆栈

返回堆栈

活动堆栈

这个问题可能会开始变得挑剔,因为它们似乎都可以互换使用,但我仍然有兴趣知道它们之间的差异(如果有的话)。

android back-stack android-navigation

5
推荐指数
1
解决办法
880
查看次数

使用 Serialized 作为 Android 导航组件的深层链接参数

Serializable使用深层链接时是否可以使用自定义对象作为片段参数?

我已经尝试了以下操作 - 在我的导航图 XML 文件中,我添加了以下几行:

<fragment
    android:id="@+id/eventFragment"
    android:name="com.myapp.EventFragment"
    android:label="EventFragment">

    <argument
        android:name="event"
        app:argType="com.myapp.EventId" />

    <deepLink app:uri="myapp://event/{event}" />

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

EventId可序列化数据类在哪里:

data class EventId(val value: Long) : Serializable
Run Code Online (Sandbox Code Playgroud)

然后,当我尝试使用 URL 运行应用程序时myapp://event/4002,会引发以下异常:

Caused by: java.lang.UnsupportedOperationException: Serializables don't support default values.
        at androidx.navigation.NavType$SerializableType.parseValue(NavType.java:834)
        at androidx.navigation.NavType$SerializableType.parseValue(NavType.java:787)
        at androidx.navigation.NavType.parseAndPut(NavType.java:96)
        at androidx.navigation.NavDeepLink.getMatchingArguments(NavDeepLink.java:99)
        at androidx.navigation.NavDestination.matchDeepLink(NavDestination.java:366)
        at androidx.navigation.NavGraph.matchDeepLink(NavGraph.java:79)
        at androidx.navigation.NavController.handleDeepLink(NavController.java:540)
        at androidx.navigation.NavController.onGraphCreated(NavController.java:499)
        at androidx.navigation.NavController.setGraph(NavController.java:460)
        at androidx.navigation.NavController.setGraph(NavController.java:425)
        at androidx.navigation.NavController.setGraph(NavController.java:407)
        at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:236)
Run Code Online (Sandbox Code Playgroud)

long用( )替换 typeapp:argType="long"解决了问题 - 没有例外,一切都按预期进行。

导航库似乎不知道如何将 URL 中的原始值转换为我的EventId类。是否可以以某种方式注册一个知道如何转换它的适配器?或者也许还有另一种解决方案?

android android-navigation android-architecture-navigation android-deep-link android-jetpack-navigation

5
推荐指数
1
解决办法
4041
查看次数

Android 导航从第一个片段中删除工具栏

我正在尝试实现来自 google 的新 Jetpack 导航框架,但遇到了问题。我想使用我的第一个片段作为登录页面,并且不希望其中有工具栏。如何从其中一个片段中删除工具栏,然后将其添加到后续片段中?

编辑:尝试查看 AppBarConfiguration,但这似乎只影响后退箭头是否显示

android android-navigation android-toolbar android-jetpack

5
推荐指数
1
解决办法
1138
查看次数

空 NavHostFragment/NavController 与 FragmentContainerView

预期的

\n\n

使用导航 UI 创建底部应用程序栏导航BottomNavigationViewFragmentContainerView类似于示例应用程序NavigationAdvancedSample

\n\n

请注意,NavigationAndvancedSample应用程序似乎没有使用文档中描述的相同实现,因为它有一个使用自定义扩展方法的解决方法实现setupWithNavController

\n\n

观察到的

\n\n

使用.在MainActivity.ktNavHostFragment中创建 时为 Null 。BottomNavigationViewFragmentContainerView

\n\n

可重现的错误和完整的代码示例可在BottomNavigationViewSample存储库中找到。

\n\n

错误

\n\n
\n

2020-05-15 12:39:19.117 18747-18747/com.example.bottomnavigationviewsample E/AndroidRuntime: 致命异常: main\n 进程: com.example.bottomnavigationviewsample, PID: 18747\n java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.example.bottomnavigationviewsample/com.example.bottomnavigationviewsample.MainActivity}:kotlin.TypeCastException:null 无法转换为非 null 类型 androidx.navigation.fragment.NavHostFragment\n 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)\n 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)\n 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java :83)\n 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\n 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\n 在 android.app.ActivityThread$ H.handleMessage(ActivityThread.java:2016)\n 在 android.os.Handler.dispatchMessage(Handler.java:107)\n 在 android.os.Looper.loop(Looper.java:214)\n 在 android.app .ActivityThread.main(ActivityThread.java:7356)\n 在 …

android android-fragments android-navigation android-architecture-navigation android-bottomappbar

5
推荐指数
1
解决办法
6442
查看次数

Android - 如何在导航架构中使用地图片段

我在我的应用程序中遇到了一个问题,我发现自己以一种笨拙的方式在 Activity 之间共享数据 - 因此我决定尝试将应用程序的大部分内容切换到单个 Activity(以便跨屏幕使用单个 ViewModel),使用导航组件交换片段而不是更改活动。

似乎对于每个目的地,我都需要一个 xml 布局文件和一个片段类,如下所示:

class DestinationFragment: Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_destination_layout, container, false)

        return view
    }
}
Run Code Online (Sandbox Code Playgroud)

(我实际上使用的是 Java,但只能找到 Kotlin 示例。

但是我不确定如何处理地图屏幕。我目前已将其作为自己的活动:

活动地图.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapsActivity">

<!--    Toolbar stuff     -->

<FrameLayout android:id="@+id/container_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/my_toolbar"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MapsActivity" />
</FrameLayout>
</RelativeLayout> …
Run Code Online (Sandbox Code Playgroud)

java android android-fragments android-navigation androidx

5
推荐指数
0
解决办法
1026
查看次数

导航组件:如何从活动导航到片段

我想在(活动)中单击 FAB 导航到新片段 1。

在我所有页面通用的主要活动中的代码 fab 按钮中。有人可以指导我吗?在此处输入图片说明

活动.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/mobile_navigation" />

    <com.google.android.material.bottomappbar.BottomAppBar
        android:id="@+id/bottomAppBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        app:navigationIcon="@drawable/ic_baseline_dashboard_24"
        app:navigationContentDescription="Navigation icon"
        />
    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/floatingActionButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_anchor="@id/bottomAppBar"
        android:backgroundTint="@color/colorPrimary"
        style="@style/Widget.App.FloatingActionButton"
        app:srcCompat="@drawable/menu_bug" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

图.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/mobile_navigation"
    app:startDestination="@+id/navigation_home">

    <fragment
        android:id="@+id/navigation_home"
        android:name="com.androidfeby.bugreport.ui.home.HomeFragment"
        android:label="@string/title_home"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/navigation_report"
        android:name="com.androidfeby.bugreport.ui.report.FragmentReport"
        android:label="@string/title_dashboard"
        tools:layout="@layout/fragment_report" />

    <fragment
        android:id="@+id/navigation_notifications"
        android:name="com.androidfeby.bugreport.ui.history.NotificationsFragment"
        android:label="@string/title_notifications"
        tools:layout="@layout/fragment_notifications" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

要求:如果我点击 fab 按钮,只需导航到图中的片段“navigation_report”

android android-navigation android-jetpack android-architecture-navigation

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

当从包中检索传递的参数时,为什么 Android Studio 会发出警告并建议使用 requireArguments() 而不是参数!!?

因此,就像标题所说,我正在尝试根据我正在使用的文档从包中检索传递的参数var args = GameWonFragmentArgs.fromBundle(arguments!!)。但Android Studio建议使用以下代码: var args = GameWonFragmentArgs.fromBundle(requireArguments())

我查找了 Fragment 的 Android 文档,发现它requireArguments()返回 @NonNull Bundle 或 IllegalStateException。为什么Android Studio建议使用它,两者有什么区别?

另外,我找不到有关 的相关文档fromBundle()

android android-fragments android-navigation

5
推荐指数
1
解决办法
2441
查看次数

在片段之间导航时如何消除白色闪烁/闪光?

我已经使用导航组件设置了底部导航,但是每​​当我在片段之间导航时,我都会看到白色闪烁。

在此输入图像描述

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    navController = Navigation.findNavController(this, R.id.dashboardNavHostFragment)
    bottomNavigationView.setupWithNavController(navController)
}
Run Code Online (Sandbox Code Playgroud)

这就是我设置底部导航的方式。

android android-layout android-fragments android-navigation android-architecture-navigation

5
推荐指数
1
解决办法
2016
查看次数

如何在一组特定的 Fragments 之间共享 ViewModel 范围,而不使用 NavGraph 或将其范围限定到活动?

谷歌表示,在 Fragment 之间进行通信时,通过将其范围限定为 Activity 来使用 SharedViewModel。

在单个 Activity 应用程序中,这意味着该 Activity 将散布着可能不再需要的 ViewModel,并且它们将在整个生命周期中保留在那里。考虑一些示例,例如扩展的注册流程或考虑几个屏幕的示例。

推荐的一种方法是使用父片段作为范围,但这只有在存在父片段时才可能。它可以只是不同的片段。

我想出了以下解决方案,我想知道它有多可行或有多糟糕,是否有更好的方法?

考虑到我有两个名为ExampleOneFragmentand的片段ExampleTwoFragment,为了简单起见,我希望它们具有共享范围,而不实际将其范围限定到活动。假设我想更新其中的文本视图ExampleOneFragmentExampleTwoFragment因此我为两者创建一个像这样的 SharedViewModel

因为ExampleOneFragment它将是:

 private val mSharedViewModel by lazy {
    ViewModelProvider(this).get(SharedViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)

因为ExampleTwoFragment我想出了这个:

private val mSharedViewModel by lazy {
    ViewModelProvider(supportFragmentManager().findFragmentByTag(ExampleOneFragment.TAG) ?: this).get(SharedViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但我不知道这会导致什么样的问题。

我发现了一些其他解决方案:根据@mikhehc这里,我们实际上可以创建我们自己的 ViewModelStore。这将使我们能够精细地控制 ViewModel 必须存在的范围。但我不明白如何让它适用于片段?

其次,仍然是将其范围限定为活动的黑客方法,但使用我在此处找到的相同密钥通过虚拟视图模型将其清除

谁能指导我什么是正确的方法?我无法转向 NavGraphs,因为它是一个已经启动并正在运行的项目,并且确定活动范围感觉是错误的。谢谢。

android android-fragments android-navigation android-viewmodel android-architecture-navigation

5
推荐指数
1
解决办法
1180
查看次数

更新了导航框架并收到错误 -“getActionId 不覆盖任何内容”

我已将导航框架从 2.3.5 更新到 2.4.0-alpha01 版本。我将它与 Safe Args gradle 插件一起使用。更新后,我开始出现'getActionId' overrides nothing错误'getArguments' overrides nothing

我认为发生这种情况是因为 Safe Args在生成 Direction 类时不正确地覆盖了actionIdarguments字段。NavDirections

例如,这是正在生成的内容:

 public override fun getActionId(): Int =
        R.id.action_navigation_articles_to_articleReaderFragment
Run Code Online (Sandbox Code Playgroud)

这是应该生成的:

public override val actionId: Int = R.id.action_navigation_articles_to_articleReaderFragment
Run Code Online (Sandbox Code Playgroud)

如何获得安全参数来生成正确的构建器类?

android android-navigation android-architecture-navigation android-safe-args

5
推荐指数
1
解决办法
1801
查看次数