我在 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 Project和Rebuild 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
我正在尝试使用 Jetpack Navigation 库在新导航事件完成时获得回调,以更改状态栏颜色。
到目前为止,我发现
navController.addOnDestinationChangedListener
它会在新导航开始时通知我,但不会在完成时通知我,这意味着进入/退出转换已完成。
有什么方法可以知道所有导航转换何时完成?
我正在使用一些最新的 Android Jetepack 组件在 Kotlin 中开发一个应用程序。我最近在以下案例中遇到了一些麻烦:
使用BottomNavigationViewwith时似乎会出现此问题NavController,并且当每个Fragment都有自己的Toolbar. 问题是,当从 Fragment A 过渡到 Fragment B 时,Fragment A和B 中标题和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
我有一个导航 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没有深层链接。如何将数据传递到具有深层链接的其他功能?
正如你所看到的,这就是我使用 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
我刚刚开始学习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
目前我正在开发一个 Android 应用程序,我想在其中使用Android Navigation Component和BottomNavigationView。
在开发上述应用程序时,我查看了官方代码实验室和几个问题,但事实证明它们没有任何帮助。
问题是分配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) 我有一个这样的脚手架:
Scaffold(
topBar = {
TopBar(...)
},
bottomBar = {
BottomNavigationBar(...)
}
) {
NavHost(...)
}
Run Code Online (Sandbox Code Playgroud)
当我导航到另一个屏幕时更改 TopBar 的最佳方法是什么?
android appbar scaffold android-navigation android-jetpack-navigation
我正在尝试使用 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
我正在尝试将其注入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
android-jetpack-navigation ×10
android ×9
kotlin ×5
androidx ×1
appbar ×1
dagger-hilt ×1
scaffold ×1