小编Flo*_*her的帖子

使用 Compose Navigation 导航时 TopAppBar 闪烁

我有 2 个屏幕,它们都有自己的ScaffoldTopAppBar。当我使用 Jetpack Navigation Compose 库在它们之间导航时,应用程序栏会闪烁。为什么会发生这种情况以及我该如何摆脱这种情况?

在此输入图像描述

代码:

导航:

@Composable
fun TodoNavHost(
    navController: NavHostController,
    modifier: Modifier = Modifier
) {
    NavHost(
        navController = navController,
        startDestination = TodoScreen.TodoList.name,
        modifier = modifier
    ) {
        composable(TodoScreen.TodoList.name) {
            TodoListScreen(
                onTodoEditClicked = { todo ->
                    navController.navigate("${TodoScreen.AddEditTodo.name}?todoId=${todo.id}")
                },
                onFabAddNewTodoClicked = {
                    navController.navigate(TodoScreen.AddEditTodo.name)
                }
            )
        }
        composable(
            "${TodoScreen.AddEditTodo.name}?todoId={todoId}", 
            arguments = listOf(
                navArgument("todoId") {
                    type = NavType.LongType
                    defaultValue = -1L
                }
            )
        ) {
            AddEditTodoScreen(
                onNavigateUp = {
                    navController.popBackStack() 
                },
                onNavigateBackWithResult = { result …
Run Code Online (Sandbox Code Playgroud)

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

19
推荐指数
3
解决办法
4777
查看次数

Android Vector资产:dp测量只对"包装内容"有影响吗?

当我创建一个矢量drawable时,我可以设置它的大小dp.默认值为24dp x 24dp.

  1. 如果我在我的应用程序中使用不同于24dp x 24dp的矢量,那么这些测量在性能方面是否重要?另外关于21岁以下的API(我app:srcCompat用来显示图像).

  2. 当使用较低的API并且系统将其缩小时,矢量大小是否重要?

  3. 这些测量对我的使用是否重要,除了我申请时只是默认大小wrap_content

android vector

13
推荐指数
1
解决办法
567
查看次数

Paging 3 - PagingDataAdapter 完成刷新并且 DiffUtil 完成比较后如何滚动到 RecyclerView 顶部?

我将 Paging 3 与 RemoteMediator 结合使用,它在从网络获取新数据的同时显示缓存的数据。当我刷新我的PagingDataAdapter(通过调用refresh()它)时,我希望我的 RecyclerView 在刷新完成后滚动到顶部。在代码实验室loadStateFlow中,他们尝试通过以下方式处理这个问题:

lifecycleScope.launch {
    adapter.loadStateFlow
            // Only emit when REFRESH LoadState for RemoteMediator changes.
            .distinctUntilChangedBy { it.refresh }
            // Only react to cases where Remote REFRESH completes i.e., NotLoading.
            .filter { it.refresh is LoadState.NotLoading }
            .collect { binding.list.scrollToPosition(0) }
    }
Run Code Online (Sandbox Code Playgroud)

这确实会向上滚动,但在 DiffUtil 完成之前。这意味着如果顶部确实插入了新数据,RecyclerView将不会一直向上滚动。

我知道 RecyclerView 适配器有一个AdapterDataObserver回调,当 DiffUtil 完成比较时我们可以收到通知。但这会导致适配器的各种竞争条件和PREPEND加载APPEND状态,这也会导致 DiffUtil 运行(但这里我们不想滚动到顶部)。

一种可行的解决方案是传递PagingData.empty()PagingDataAdapter并重新运行相同的查询(仅调用refresh是行不通的,因为PagingData现在是空的并且没有任何内容可以刷新),但我更愿意保持旧数据可见,直到我知道刷新实际上成功了。

paging android android-paging android-paging-library android-paging-3

11
推荐指数
1
解决办法
8549
查看次数

NotificationManagerCompat与NotificationManager

什么向后兼容性

NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
Run Code Online (Sandbox Code Playgroud)

提供我从正常情况下得不到的

 NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Run Code Online (Sandbox Code Playgroud)

他们都有一种notify方法可以在我测试的设备上运行(低至API级别19).

此处的Google示例甚至不使用该Compat版本一次:

https://github.com/googlesamples/android-NotificationChannels/blob/master/Application/src/main/java/com/example/android/notificationchannels/NotificationHelper.java

notifications android push-notification android-notifications

10
推荐指数
1
解决办法
1405
查看次数

检查导航图是否位于返回堆栈上

我的导航图有一个auth包含 LoginFragment 和 SignUpFragment 的子图:

<navigation
    android:id="@+id/auth"
    app:startDestination="@id/loginFragment">
    <fragment
        android:id="@+id/signUpFragment"
        [...]
    <fragment
        android:id="@+id/loginFragment"
        [...]
    </fragment>
    [...]
</navigation>
Run Code Online (Sandbox Code Playgroud)

我想检查这两个目的地中的任何一个当前是否位于返回堆栈上。但不要单独检查每个目的地,如下所示:

val currentDestId = navController.currentDestination?.id
if (currentDestId != R.id.loginFragment && currentDestId != R.id.signUpFragment) {
    navController.navigate(
        NavGraphDirections.actionGlobalLogin()
    )
}
Run Code Online (Sandbox Code Playgroud)

我认为只检查身份验证图当前是否位于返回堆栈上会更干净。

我目前的方法如下:

val authBackStack = try {
    navController.getBackStackEntry(R.id.auth)
} catch (t: Throwable) {
    null
}
if (authBackStack == null) {
    navController.navigate(
        NavGraphDirections.actionGlobalLogin()
    )
}
Run Code Online (Sandbox Code Playgroud)

这里的想法是,如果传递的目标(或本例中的图形)当前不在返回堆栈上,则getBackStackEntry抛出异常。IllegalStateException我们使用此异常作为指示器来查明我们的图形当前是否位于返回堆栈上。

这是一种有效的方法还是在某些情况下会失败?或者也许有更好的方法来检查返回堆栈是否包含某个子图的目的地?

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

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

测试 Room AutoMigrations 时,我应该向 runMigrationsAndValidate 传递什么?

使用Room AutoMigrations时,它Migration本身会自动生成。但为了对迁移进行单元测试,我必须将一个Migration对象传递给runMigrationsAndValidate. 我应该在这里传递什么?

@RunWith(AndroidJUnit4::class)
class MigrationTest {
    private val TEST_DB = "migration-test"

    @Rule
    val helper: MigrationTestHelper = MigrationTestHelper(
            InstrumentationRegistry.getInstrumentation(),
            MigrationDb::class.java.canonicalName,
            FrameworkSQLiteOpenHelperFactory()
    )

    @Test
    @Throws(IOException::class)
    fun migrate1To2() {
        var db = helper.createDatabase(TEST_DB, 1).apply {
            // db has schema version 1. insert some data using SQL queries.
            execSQL(...)

            // Prepare for the next version.
            close()
        }

        // Re-open the database with version 2 and provide
        // Migration as the migration process.
        db …
Run Code Online (Sandbox Code Playgroud)

android android-testing android-sqlite android-room

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

有没有办法立即删除 Firebase 项目?

我陷入困境,因为由于许多不同的待删除操作,我达到了项目配额(我不知道它们计入限制)。

有没有一种方法可以立即删除这些项目,以便我可以立即创建一个新项目?

firebase firebase-realtime-database google-cloud-firestore

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

Firestore-如何在模型类中正确存储文档ID?

没有关于如何在自定义Java对象中正确存储Firestore文档的自动生成ID的真实文档。检索ID很容易,但是如何正确存储ID以避免冗余。

这是我的方法:

型号类别:

public class Note {
    private String documentId;
    private String title;
    private String description;

    public Note() {
        //public no arg constructor necessary
    }

    public Note(String title, String description) {
        this.title = title;
        this.description = description;
    }

    @Exclude
    public String getDocumentId() {
        return documentId;
    }

    public void setDocumentId(String documentId) {
        this.documentId = documentId;
    }

    public String getTitle() {
        return title;
    }

    public String getDescription() {
        return description;
    }
}
Run Code Online (Sandbox Code Playgroud)

加载数据:

public void loadNotes(View v) {
    notebookRef.get()
            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() { …
Run Code Online (Sandbox Code Playgroud)

android firebase google-cloud-firestore

7
推荐指数
2
解决办法
1521
查看次数

为什么 Dagger 组件必须声明它们的作用域?

为什么我必须用它要使用的范围来注释 Dagger 组件?为什么对类本身进行注释还不够?

android dependency-injection dagger dagger-2

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

什么是需要的 USE_BIOMETRIC 权限?

文件USE_BIOMETRIC许可说

允许应用使用设备支持的生物识别方式。

但是 AndroidX 的BiometricPrompt 作品没有这个许可。那么它究竟需要什么呢?

android androidx android-biometric-prompt android-biometric

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