标签: android-jetpack-navigation

androidx 导航:@NonNull 公共开放乐趣的参数太多

我在 Android Studio 中使用导航编辑器来实现Safe Args.

我在一个片段中接受参数为

 <fragment
    android:id="@+id/gameWonFragment"
    android:name="com.example.android.navigation.GameWonFragment"
    android:label="@string/android_trivia"
    tools:layout="@layout/fragment_game_won">

    <action
        android:id="@+id/action_gameWonFragment_to_gameFragment"
        app:destination="@id/gameFragment"
        app:popUpTo="@+id/titleFragment">
    </action>
    <argument
        android:name="numQuestions"
        app:argType="integer"
        android:defaultValue="0" />
    <argument
        android:name="numCorrect"
        app:argType="integer"
        android:defaultValue="0" />
 </fragment>
Run Code Online (Sandbox Code Playgroud)

在我的片段中,我将参数发送为

view.findNavController().navigate(GameFragmentDirections.actionGameFragmentToGameWonFragment(numQuestions, questionIndex))
Run Code Online (Sandbox Code Playgroud)

但是,GameFragmentDirections.actionGameFragmentToGameWonFragment()不想接受论据。我试过Clean ProjectRebuild Project

这是抛出:

Too many arguments for @NonNull public open fun actionGameFragmentToGameWonFragment(): GameFragmentDirections.ActionGameFragmentToGameWonFragment defined in com.example.android.navigation.GameFragmentDirections
Run Code Online (Sandbox Code Playgroud)

android android-studio android-jetpack androidx android-jetpack-navigation

7
推荐指数
3
解决办法
5079
查看次数

Jetpack 导航动画完整侦听器

我正在尝试使用 Jetpack Navigation 库在新导航事件完成时获得回调,以更改状态栏颜色。

到目前为止,我发现 navController.addOnDestinationChangedListener 它会在新导航开始时通知我,但不会在完成时通知我,这意味着进入/退出转换已完成。

有什么方法可以知道所有导航转换何时完成?

android android-jetpack android-jetpack-navigation

7
推荐指数
1
解决办法
804
查看次数

将 BottomNavigationView 与 NavController 一起使用时的动画问题,并且每个 Fragment 都有自己的工具栏

我正在使用一些最新的 Android Jetepack 组件在 Kotlin 中开发一个应用程序。我最近在以下案例中遇到了一些麻烦:

使用BottomNavigationViewwith时似乎会出现此问题NavController,并且当每个Fragment都有自己的Toolbar. 问题是,当从 Fragment A 过渡到 Fragment B 时,Fragment AB 中标题ActionBar 导航图标的更改会更新。理想情况下,为了平滑过渡,Fragment A 中 AppBar 的状态不会发生变化。我怀疑这可能源于这些属性不“属于”的事实,因为这似乎不会以相同的方式影响工具栏的菜单项。Toolbar

AppBar 标题的解决方法是在其各自的 fragment_layout.xml 中设置每个 Toolbar 的 title 属性,同时还从 navFragment.xml 中删除 label 属性(通常负责在使用导航控制器)。

但是,这并不能解决 actionBar 导航图标的问题,例如 Up / Home 按钮,它们不会出现在顶级目的地,但会出现在其他目的地。所以就我而言,它看起来仍然很糟糕。

我已按如下方式连接导航:

主活动.kt

class MainActivity : AppCompatActivity() {

    lateinit var appBarConfiguration: AppBarConfiguration
    lateinit var navController: NavController

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding: MainActivityBinding …
Run Code Online (Sandbox Code Playgroud)

android-animation android-actionbar android-toolbar bottomnavigationview android-jetpack-navigation

7
推荐指数
0
解决办法
129
查看次数

Android 导航组件使用 safeArgs 和深层链接传递参数

我有一个导航 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/navigation_featureB.xml"
    app:startDestination="@id/FragmentB">

    <fragment
        android:id="@+id/FragmentB"
        android:name="FragmentB"
        android:label="FragmentB">
        <deepLink app:uri="App://FragmentB" />
    </fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)

在我的FeatureA片段中,我执行以下操作 -

val uri = Uri.parse("App://FragmentB")
findNavController().navigate(uri)
Run Code Online (Sandbox Code Playgroud)

我知道如何使用safeArgs没有深层链接。如何将数据传递到具有深层链接的其他功能?

android kotlin android-jetpack android-jetpack-navigation

7
推荐指数
1
解决办法
1万
查看次数

Jetpack compose NavHost 防止重组屏幕

正如你所看到的,这就是我使用 MaterialBottomNavigation 实现 NavHost 的方式,我在消息提要屏幕上都有很多项目,当我在这两个屏幕之间导航时,它们会自动重新组合,但我不想,因为那里有太多数据,它会闪烁并且 fps 下降导航时低于 10,我尝试在 NavHost 之前初始化数据 viewModel,但结果仍然相同,有没有办法一次性组合屏幕并在 viewModels 数据更新时更新它们?

@Composable
private fun MainScreenNavigationConfigurations(
    navController: NavHostController,
    messagesViewModel: MessagesViewModel = viewModel(),
    feedsViewModel: FeedsViewModel = viewModel(),

) {

val messages: List<Message> by messagesViewModel.messages.observeAsState(listOf())
val feeds: List<Feed> by feedsViewModel.messages.observeAsState(listOf())

NavHost(
    navController = navController,
    startDestination = "Messages"
) {
    composable("Messages") {
        Messages(navController, messages)
    }
    composable("Feeds") { Feeds(navController, feeds) }
  }
}
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack android-jetpack-navigation android-jetpack-compose

7
推荐指数
1
解决办法
3207
查看次数

观察实时数据并在 jetpack compose 中导航

我刚刚开始学习jetpack compose。我有一个非常基本的问题。我的 ViewModel 有一个 SingleLiveEvent,我用它导航到另一个屏幕。

private val _navigateToDetails: SingleLiveEvent<Movie> = SingleLiveEvent()
val navigateToDetails: MutableLiveData<Movie> = _navigateToDetails
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用 Livedata 作为状态来发出 UI,但如何使用它来触发可组合项中的某些操作。

以前我习惯于viewLifecycleOwner像任何人一样观察国家。

viewModel.navigateToDetails.observe(viewLifecycleOwner) {
    // navigate to details
}
Run Code Online (Sandbox Code Playgroud)

我如何在 compose 中实现同样的目标。我不知道这是否可能。也许我没有以写作的方式思考这个问题。任何帮助,将不胜感激。

android kotlin android-jetpack-navigation android-jetpack-compose

7
推荐指数
1
解决办法
6421
查看次数

BottomNavigationView.setupWithNavController 不起作用

目前我正在开发一个 Android 应用程序,我想在其中使用Android Navigation ComponentBottomNavigationView

在开发上述应用程序时,我查看了官方代码实验室和几个问题,但事实证明它们没有任何帮助。

问题是分配navController给 myBottomNavigationView似乎没有任何效果 - 单击菜单项不会影响导航主机。

我的代码:

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns: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">

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

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/main_nav_bnv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="@android:color/transparent"
        android:elevation="0dp"
        app:elevation="0dp"
        app:menu="@menu/menu_main" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

MainActivity.kt

import android.os.Bundle
import android.os.PersistableBundle
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.NavigationUI
import androidx.navigation.ui.setupWithNavController
import com.aredruss.qurio.databinding.ActivityMainBinding
import com.aredruss.qurio.helpers.viewBinding

class MainActivity : AppCompatActivity() {

    // ViewBindingDelegate
    private val …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack android-jetpack-navigation

7
推荐指数
1
解决办法
6182
查看次数

如何更改Jetpack Compose中topBar对应的屏幕

我有一个这样的脚手架:

Scaffold(
   topBar = {
       TopBar(...)
   },
   bottomBar = {
       BottomNavigationBar(...)
   }
) {
    NavHost(...)
}
Run Code Online (Sandbox Code Playgroud)

当我导航到另一个屏幕时更改 TopBar 的最佳方法是什么?

android appbar scaffold android-navigation android-jetpack-navigation

7
推荐指数
1
解决办法
1904
查看次数

如何使用 JetPack Compose 在 LazyColumn 项目中单击导航到详细信息视图?

我正在尝试使用 JetPack Compose 创建一个应用程序(第一次),但导航时遇到一些问题。该应用程序有一个包含 3 个项目的底部栏,可导航到所选屏幕。

这是有效的,问题是当我尝试访问屏幕之一中的 LazyColumn 的项目之一时。我想导航到另一个屏幕(配置文件),其中显示所选项目的数据,但我找不到方法。无论我如何尝试,我总是得到这个“@Composable 调用只能在 @Composable 函数的上下文中发生”。

有人可以帮助我解释如何做吗?我想要的是了解如何以及为什么,而不仅仅是复制。

谢谢

主要活动

class MainActivity : ComponentActivity() {

    @ExperimentalFoundationApi
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)


        setContent {
            val systemUiController = rememberSystemUiController()

            SideEffect {
                systemUiController.setStatusBarColor(color = PrimaryDark)
            }
            AppTheme() {


                MainScreen()

            }

        }
    }

    @ExperimentalFoundationApi
    @Composable
    fun MainScreen() {
        val navController = rememberNavController()
        val navigationItems = listOf(Obras, Talleres, Ajustes)
        Scaffold(bottomBar = {
            BottomNavigationBar(
                navController = navController,
                items = navigationItems
            )
        }) {

            NavigationHost(navController)
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

导航主机.kt

@ExperimentalFoundationApi
@Composable …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-navigation android-jetpack-compose

7
推荐指数
1
解决办法
5645
查看次数

如何使用 hilt 将 jetpack compose 中的“rememberNavController”注入到 Activity 中?

我正在尝试将其注入navHostController我的MainActivity使用刀柄中。但在尝试编译代码时出现以下错误:

> Task :app:kaptDebugKotlin
C:\Users\pierr\AndroidStudioProjects\AndroidApps\Compose\Udemy\course01\crud\app\build\generated\source\kapt\debug\com\example\crud\CrudApplication_HiltComponents.java:129: error: [Dagger/MissingBinding] androidx.navigation.NavHostController cannot be provided without an @Inject constructor or an @Provides-annotated method.
  public abstract static class SingletonC implements CrudApplication_GeneratedInjector,
                         ^
      androidx.navigation.NavHostController is injected at
          com.example.crud.ui.MainActivity.navHostController
      com.example.crud.ui.MainActivity is injected at
          com.example.crud.ui.MainActivity_GeneratedInjector.injectMainActivity(com.example.crud.ui.MainActivity) [com.example.crud.CrudApplication_HiltComponents.SingletonC ? com.example.crud.CrudApplication_HiltComponents.ActivityRetainedC ? com.example.crud.CrudApplication_HiltComponents.ActivityC]

> Task :app:kaptDebugKotlin FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction
   > java.lang.reflect.InvocationTargetException (no error message)

* Try:
Run …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-navigation android-jetpack-compose dagger-hilt

7
推荐指数
1
解决办法
9024
查看次数