标签: android-navigation

如果我点击导航控制器中的菜单,如何在两个片段目的地之间传递数据?

我正在尝试使用导航控制器。我有一个底部导航视图。位于我的 MainActivity 上,它是使用以下代码启动的:

class MainActivity : AppCompatActivity() {

    lateinit var navController : NavController
    lateinit var logoHeaderImageView : ImageView
    var toolbarMenu : Menu? = null


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

        logoHeaderImageView = findViewById(R.id.header_lakuin_image_view)

        navController = Navigation.findNavController(this,R.id.nav_main_host_fragment)



        setupBottomNavMenu(navController)
        setupActionBar(navController)



    }

    fun setupBottomNavMenu(navController: NavController) {
        NavigationUI.setupWithNavController(bottom_navigation_view,navController)
    }

    fun setupActionBar(navController: NavController) {
        setSupportActionBar(main_activity_toolbar)
        main_activity_toolbar.title = ""


        val appBarConfiguration = AppBarConfiguration(
            setOf(
                // set some destination as the top hierarchy destination, to make the up button doesn't show.
                R.id.destination_home,
                R.id.destination_order,
                R.id.destination_favourite,
                R.id.destination_cart,
                R.id.destination_profile …
Run Code Online (Sandbox Code Playgroud)

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

4
推荐指数
1
解决办法
4506
查看次数

为什么我的片段没有显示在导航控制器中?

我是使用 Android 导航控制器的新手。

这是我的主要活动的 xml:

<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".Activities.MainActivity">

    <androidx.appcompat.widget.Toolbar
            android:id="@+id/main_activity_toolbar"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:minHeight="?attr/actionBarSize"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:elevation="4dp" app:layout_constraintHorizontal_bias="0.0">
    </androidx.appcompat.widget.Toolbar>

    <fragment
            android:id="@+id/nav_main_host_fragment"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toTopOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/main_activity_toolbar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:name="androidx.navigation.fragment.NavHostFragment"
            app:navGraph="@navigation/main_graph"
            app:defaultNavHost="true"
    />

</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

我的 kotlin 主要活动:

class MainActivity : AppCompatActivity(),NavController.OnDestinationChangedListener {
    lateinit var navController : NavController

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

        navController = Navigation.findNavController(this,R.id.nav_main_host_fragment)
        navController.addOnDestinationChangedListener(this)

        setupActionBar()
    }

    override fun onDestinationChanged(
        controller: NavController,
        destination: NavDestination,
        arguments: Bundle?) {
    }

    private fun setupActionBar() {
        setSupportActionBar(main_activity_toolbar)
        supportActionBar?.title …
Run Code Online (Sandbox Code Playgroud)

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

4
推荐指数
1
解决办法
3854
查看次数

如何使用Android中的导航控制器以编程方式返回上一个目的地?

我有如下图所示的登录过程:

在此处输入图片说明

用户将使用以下代码从登录屏幕(中间)导航到更改密码屏幕(右侧):

 val changePassword = LoginUsingEmailFragmentDirections.actionToChangePasswordFragment()
Navigation.findNavController(fragmentView).navigate(changePassword)
Run Code Online (Sandbox Code Playgroud)

我想如果用户成功更改密码,我想让用户以编程方式返回登录屏幕。

如果我使用使用大量活动的旧方式导航,那么我通常使用 finish()

我有点困惑什么是实现这一目标的正确方法。我是否需要先在图表中采取行动,然后使用与上面类似的代码?或者有没有更方便或更好的方法来做到这一点?

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

4
推荐指数
1
解决办法
1142
查看次数

如何使用 Android 中的导航控制器组件返回根片段或层次结构顶部?

假设我在底部导航视图中有 4 个选项卡。如果用户选择这些选项卡之一,那么用户将从一个片段导航到其他片段。

假设用户选择第一个选项卡(主页),然后从以下位置导航:

片段A(主目录) -> 片段B -> 片段C -> 片段D -> 片段E

我想使用Android中的导航控制器组件以编程方式从fragmentE返回到fragmentA。怎么做 ?

我尝试过使用这段代码,但它只是返回到fragmentD(形成fragmentE)

btn.setOnClickListener{
 Navigation.findNavController(view).navigateUp()
}
Run Code Online (Sandbox Code Playgroud)

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

4
推荐指数
1
解决办法
2823
查看次数

使用 NavigationComponent 和 BottomNavigationView 隐藏工具栏后退箭头

我正在实现 NavigationComponent 和一个 BottomNavigationView,我注意到工具栏中显示了所有片段目的地的后退箭头,但startDestination在我的导航图中指定为 的除外。

我能够找到的此实现的所有示例都显示出类似的行为。在我看来,为 BottomNavigationView 的每个相关片段隐藏后退箭头似乎是一种更自然的设计,(点击工具栏中的后退箭头从选项卡 2 导航到选项卡 1 对我来说感觉很奇怪,我以前从未见过这种情况) .

有关示例以及我希望实现的目标,请参见下图。有什么办法可以做到这一点吗?在此处输入图片说明

android android-navigation android-toolbar android-jetpack android-jetpack-navigation

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

导航组件 - onSupportNavigateUp()

真的有必要打电话吗

override fun onSupportNavigateUp() = findNavController(R.id.nav_host_fragment).navigateUp()
Run Code Online (Sandbox Code Playgroud)

在我的 MainActivity 中?

因为当我在我的 xml 中附加 NavHostFragment 时,它从那里开始,但是我看过 Google I/O 讲座,他们使用它来作为导航的起点

我的问题

哪里有必要使用它?

谢谢

android android-fragments kotlin android-navigation android-architecture-navigation

4
推荐指数
1
解决办法
5163
查看次数

在片段内使用带有单个活动、布局抽屉和工具栏的 Android 导航组件

是否可以在每个片段都有自己的工具栏的单个活动应用程序中使用 Android 导航组件/图形?

此外,容器活动有一个导航抽屉,需要设置工具栏和导航控制器,但在活动创建时我还没有工具栏。

我正在使用此代码(在 onCreate 中调用)

    private fun setupNavigation() {

//        val toolbar = findViewById<Toolbar>(R.id.toolbar);
//        setSupportActionBar(toolbar);
//        supportActionBar!!.setDisplayHomeAsUpEnabled(true);
//        supportActionBar!!.setDisplayShowHomeEnabled(true);

    val drawerLayout = findViewById<DrawerLayout>(R.id.drawer_layout);

    val navigationView = findViewById<NavigationView>(R.id.drawer_navigation_view);

    val navController = Navigation.findNavController(this, R.id.navigation_host_fragment);

    NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)

    NavigationUI.setupWithNavController(navigationView, navController)

    navigationView.setNavigationItemSelectedListener(this)
}
Run Code Online (Sandbox Code Playgroud)

但是由于我当时没有工具栏,它会引发错误(在空对象上调用 ActionBar.setTitle)。

是否有可能有这个,或者我需要放弃在这种情况下使用导航组件的想法?

android navigation-drawer android-navigation android-navigationview android-architecture-navigation

4
推荐指数
1
解决办法
1693
查看次数

即使在使用导航 2.2.1 后仍然有错误没有当前导航节点

我曾尝试阅读此内容,但它并没有解决我的问题

所以我使用此代码导航到下一个目的地

 val nextDirection = CreateEventNameFragmentDirections.actionToCreateEventType(userKM, newEvent)
 findNavController().navigate(nextDirection)
Run Code Online (Sandbox Code Playgroud)

但它在我错误旋转设备后崩溃

java.lang.IllegalStateException: 没有当前导航节点

我用这个更新gradle

implementation 'android.arch.navigation:navigation-fragment-ktx:2.2.1'
implementation 'android.arch.navigation:navigation-ui-ktx:2.2.1'
Run Code Online (Sandbox Code Playgroud)

但它仍然不起作用,它仍然崩溃。我该怎么办 ?这是我的主要活动

class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedListener {

    private lateinit var navController : NavController



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


        // Initial Setup views
        navController = Navigation.findNavController(this,R.id.nav_host_fragment)



        setupBottomNavMenu()
        setupActionBar()


        // Add Listeners
        navController.addOnDestinationChangedListener(this)




    }





    private fun setupBottomNavMenu() {
        bottom_nav.setupWithNavController(navController)
    }


    private fun setupActionBar() {

        generalToolbar.title = ""
        searchToolbar.title = ""
        searchWithBackButtonToolbar.title = ""

        // set up top hierarchy destination
        val appBarConfiguration …
Run Code Online (Sandbox Code Playgroud)

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

4
推荐指数
1
解决办法
2110
查看次数

Android 导航 - 弹出后退堆栈时删除操作栏后退按钮

我正在尝试做什么

我正在使用 Android 导航组件来处理我的应用程序中的导航。在此示例中,我有两个屏幕,屏幕 A 和屏幕 B。我希望用户能够单击屏幕 A 中的按钮并能够导航到屏幕 B;然后无法返回到上一屏幕(屏幕 A)。

问题

当用户从屏幕 A 导航到屏幕 B 时,操作栏上的后退按钮仍然允许用户返回上一屏幕,但是当单击底部栏中的后退按钮时,它会退出应用程序,因此这部分工作正常。

我需要做什么才能删除操作栏中的后退按钮?

在此输入图像描述

到目前为止我读过的内容

我已遵循这三篇文章中的指导,但我认为他们可能忽略了ActionBar后退按钮:

我的代码

导航图 - 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"
    android:id="@+id/nav_graph"
    app:startDestination="@id/screen_a">
    <fragment
        android:id="@+id/screen_a"
        android:name="com.example.conditionalnavigation.AFragment"
        android:label="screen A">
        <action
            android:id="@+id/action_AFragment_to_BFragment"
            app:destination="@id/screen_b"
            app:launchSingleTop="true"
            app:popUpTo="@id/screen_a"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/screen_b"
        android:name="com.example.conditionalnavigation.BFragment"
        android:label="screen B" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

MainActivity - 这充当我的单一活动导航主机。

class MainActivity : AppCompatActivity() {

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

android kotlin back-stack android-navigation android-jetpack-navigation

4
推荐指数
1
解决办法
4139
查看次数

将 ArrayList 作为参数传递给 safeArgs

我试图ArrayList<String>在使用 safeArgs 时将 an作为参数传递。但是当我从可序列化和构建的列表中选择 ArrayList 时,它向我抛出这些异常

One type argument expected for class ArrayList<E : Any!>
One type argument expected. Use 'ArrayList<*>' if you don't want to pass type arguments
Run Code Online (Sandbox Code Playgroud)

我知道我必须为 ArrayList 设置数据类型,但在从导航图屏幕设置 safeArgs 时,我无法这样做,也没有选项。

在导航图 XML 中,代码生成为

<argument
            android:name="teamsToAdd"
            app:argType="java.util.ArrayList" />
Run Code Online (Sandbox Code Playgroud)

有没有办法在导航图的 XML 中声明 dataType?

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

4
推荐指数
1
解决办法
3211
查看次数