标签: android-jetpack-navigation

setOnApplyWindowInsetsListener() 未应用填充并调用 2 次

我打电话setOnApplyWindowInsetsListener给我的视图添加填充/边距。我的 XML 包含android:fitsSystemWindows="true"

setOnApplyWindowInsetsListener被调用两次后(第二次插入 0)。

为什么 Android 返回 insets 两次并且第二次 insets 值为零?为什么当我将其设置为第一个值时,我的填充不适用?

代码:

drawer.setOnApplyWindowInsetsListener((v, insets) -> {
            profileButton.setPadding(
                    profileButton.getPaddingLeft(),
                    profileButton.getPaddingTop(),
                    insets.getSystemWindowInsetBottom(),
                    profileButton.getPaddingBottom()
            );
            Timber.d("Inset applied: %d", insets.getSystemWindowInsetBottom());
            return insets;
        });
Run Code Online (Sandbox Code Playgroud)

控制台输出:

D/MainActivity: Inset applied: 53
D/MainActivity: Inset applied: 0
Run Code Online (Sandbox Code Playgroud)

android android-layout android-jetpack android-jetpack-navigation

9
推荐指数
0
解决办法
883
查看次数

使用 Compose 时如何在 Jetpack Navigation 中显示布局?

我开始使用 Jetpack Compose,我对它非常满意。我替换了几个由@Composable函数在 xml 中定义的布局。

当我回到我的 Navigation-xml 时,我注意到每个屏幕内的预览都是通过tools:layout属性完成的。以及对 xml 中布局的属性引用。不是一个@Composable函数。

@Composable是否已经有一种方法可以从导航 xml 中引用函数,tools:layout以便整个流程的预览可见?

android android-jetpack-navigation android-jetpack-compose

9
推荐指数
0
解决办法
644
查看次数

如何从嵌套可组合 Jetpack Compose 访问 NavHostController

假设我的应用程序如下所示

@Composable
fun AppNavigation() {
    val navController = rememberNavController()

    NavHost(navController, startDestination = Route.Home.route) {
        /// other composes
        composable("Home") { HomeCompose(navController) }
    }
}

@Composable
fun HomeCompose(navController: NavHostController) {
    ChildCompose(navController)
}

@Composable
fun ChildCompose(navController: NavHostController) {
    navController.navigate("")
}
Run Code Online (Sandbox Code Playgroud)

我想访问嵌套可组合项中的 navController 进行导航,但我不想将 navController 从父可组合项传递到子可组合项,如上所述

无论如何,是否可以从 NavHost 内的任何位置访问 navController,而无需通过可组合层次结构传递它

编辑:现在,我可以使用 CompositionLocalProvider 访问嵌套组合中的 navController,如下所示

val AppNavController = compositionLocalOf<NavHostController>() { error("NavHostController error") }

@Composable
fun AppNavigation() {
    val navController = rememberNavController()
    CompositionLocalProvider(
        AppNavController provides navController
    ) {
        NavHost(navController, startDestination = Route.Home.route) {
            /// other composes …
Run Code Online (Sandbox Code Playgroud)

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

9
推荐指数
1
解决办法
3708
查看次数

Android 导航组件片段过渡具有白色背景

我正在使用 Jetpack Navigation 库并且在片段转换方面遇到问题,无论是淡入淡出还是幻灯片动画,它始终具有白色背景而不是前一个屏幕内容。

片段 A -> 片段 B,当动画正在运行而不是将背景视为片段 A 时,它是白色背景。

导航

  <fragment
      android:id="@+id/nav_page"
      android:name="my.fragmenta"
      tools:layout="@layout/fragment_a">

    <action
        android:id="@+id/action_to_b"
        app:destination="@id/nav_b"
        app:enterAnim="@anim/slide_in_up"
        app:popExitAnim="@anim/slide_out_down"/>
  </fragment>
Run Code Online (Sandbox Code Playgroud)

活动方式

  <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:statusBarColor">@color/statusBarColor</item>
  </style>
Run Code Online (Sandbox Code Playgroud)

动画文件

<translate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="100%p"
    android:toYDelta="0"
    android:duration="@android:integer/config_longAnimTime" />
Run Code Online (Sandbox Code Playgroud)

<translate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="0"
    android:toYDelta="100%p"
    android:duration="@android:integer/config_longAnimTime" />
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何解决它?

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

8
推荐指数
1
解决办法
1373
查看次数

Fragment 刷新返回 - Android 导航

我正在使用 Android 导航组件制作应用程序。但是我遇到了一个非常基本的问题,它可能会导致我的应用程序的整个开发出现问题。

情景

我有这个片段,onViewCreated我在其中观察我的视图模型中的一个字段。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    viewModel = ViewModelProviders.of(this).get(EventDetailsViewModel::class.java)
    viewModel.init(context!!,eventId)

    viewModel.onEventDetailsUpdated().observe(this, Observer {
        setEventDetails(it)
    })

}
Run Code Online (Sandbox Code Playgroud)

在该setEventDetails方法中,我使用数据设置了 recyclerviews。

问题

这个片段是一个带有卷轴的长片段。假设我向下滚动到一个部分,然后单击一个按钮,将我带到另一个片段。

但是当我回到这个片段时,它再次将我带到顶部并完成它在第一次加载时所做的一切。这可能令人不安。它有点像重新创建整个片段而不是保持其旧状态。

我试过的

我搜索了很多问题。并经历了This Github QueryThis SO questionAnother Git ......但我无法解决我的问题。

请帮助,提前致谢。

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

8
推荐指数
1
解决办法
1169
查看次数

导航组件:IllegalStateException 片段与片段管理器无关

我正在使用导航组件版本2.1.0-rc01,我使用 3 个屏幕之间来回导航

Navigation.findNavController(it).navigate(R.id.action_participants)

第二次通过相同的屏幕后,我可以看到第二个片段,但我收到一个异常。我在 FragmentManager 上启用了日志,似乎没有附加相同片段的不同实例,导致错误

关于为什么导航组件创建另一个未附加的片段实例的任何想法?获取附加片段的任何解决方法?

    2019-08-15 16:59:30.895 30041-30041/com.app.debug D/FragmentManager:   mName=3-2131361912 mIndex=-1 mCommitted=false
2019-08-15 16:59:30.895 30041-30041/com.app.debug D/FragmentManager:   mEnterAnim=#7f01001e mExitAnim=#7f01001f
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager:   mPopEnterAnim=#7f010020 mPopExitAnim=#7f010021
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager:   Operations:
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager:     Op #0: REPLACE StaffBookingDetailsFragment{82e8301 (97f79b28-d8c1-432a-9e1c-3a781dd42434) id=0x7f0a01c5}
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager:   enterAnim=#7f01001e exitAnim=#7f01001f
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager:   popEnterAnim=#7f010020 popExitAnim=#7f010021
2019-08-15 16:59:30.896 30041-30041/com.app.debug D/FragmentManager:     Op #1: SET_PRIMARY_NAV StaffBookingDetailsFragment{82e8301 (97f79b28-d8c1-432a-9e1c-3a781dd42434) id=0x7f0a01c5}
2019-08-15 16:59:30.897 30041-30041/com.app.debug D/FragmentManager:   enterAnim=#7f01001e exitAnim=#7f01001f
2019-08-15 16:59:30.897 30041-30041/com.app.debug D/FragmentManager:   popEnterAnim=#7f010020 popExitAnim=#7f010021
2019-08-15 16:59:31.935 …
Run Code Online (Sandbox Code Playgroud)

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

8
推荐指数
3
解决办法
5973
查看次数

与来自 jetpack 的 Android 导航一起使用时,始终会重新创建片段

我正面临着使用 Android 导航组件重新创建片段的问题。我已经集成了底部导航并将其与 android 导航组件结合起来。因此,每次单击底部栏上的选项卡时,都会重新创建片段并且不会保留旧状态。

即使我转到其他选项卡并返回,我也想保留片段的状态。我没有在任何地方找到任何解决方案。

除了底部导航,我使用navController.navigate()方法在不同的片段之间导航。

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

8
推荐指数
1
解决办法
2933
查看次数

如何使用导航组件切换到不同返回堆栈中的其他片段?

我有 3 个底部导航选项卡,称为Home, Dashboard, Profile.

  • Home,我有Fragment1Fragment2
  • Dashboard,我有Fragment3Fragment4
  • 在 中Profile,我有MyProfileEditProfile

现在,在 中Fragment2,一个按钮changeAvatar可以EditProfile在 stack 中打开Profile。因为EditProfile应该在 tab 中Profile,所以如果我不想包含EditProfilenavGraphof 中Home,我该如何实现这种行为?

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

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

Jetpack Compose 导航:从具有相同路线(参数除外)的屏幕弹出到屏幕

导航撰写版本2.4.0-alpha06

我有一个导航抽屉Scaffold,其中部分项目是由 ViewModel 动态生成的。

示例项目有

  • A
  • C ...
  • 设置

其中 A、B、C... 都共享相同的Screencalled Category,只是传递了不同的参数(例如 Category/A、Category/B)。

在我的里面Scaffold

...

val items = viewModel.getDrawerItems()
// This gives something like 
// ["Home", "Category/A", "Category/B", "Category/C", ..., "Settings"] 
// where each String represents "route"

...

val backstackEntry = navController.currentBackStackEntryAsState()
val currentScreen = Screen.fromRoute(
    backstackEntry.value?.destination?.route
)
Log.d("Drawer", "currentScreen: $currentScreen")

items.forEach { item ->
    DrawerItem(
        item = item, 
        isSelected = currentScreen.name == item.route, 
        onItemClick = {
            Log.d("Drawer", "destinationRoute: ${item.route}") …
Run Code Online (Sandbox Code Playgroud)

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

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

为什么导航可组合项调用两次?

为什么导航可组合项调用两次?如果我在文本上设置断点,应用程序运行时我将停止两次。谢谢您的回答。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val navController = rememberNavController()
            var i: Int = 0
            NavHost(navController = navController, startDestination = "s1") {
                composable("s1") {
                    i++
                    Text("$i")

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

android-jetpack-navigation

8
推荐指数
1
解决办法
1129
查看次数