小编Fan*_*dez的帖子

使用 Scaffold 在 Material Design 3 中显示 Snackbar

决定在我的新 Jetpack Compose 项目中尝试Material Design 3 。一切都很舒适,直到我碰壁时需要展示一个 Snackbar。

MD2中,这非常简单,您可以在使用SnackbarHostState.showSnackbar()协程作用域内的函数完成的支架中显示小吃栏。我观察到您只需要从androidx.compose.material.rememberScaffoldState材质库导入即可。

import androidx.compose.material.rememberScaffoldState


@Composable
fun MyScreenInMaterial2() {
    val scaffoldState = rememberScaffoldState()
}
Run Code Online (Sandbox Code Playgroud)

当我在MD3中尝试相同的操作时,该rememberScaffoldState()功能未得到解析。 在此输入图像描述

对于那些深入了解 MD3 世界的人来说,如何在脚手架中显示 Snackbar?我已经检查了文档和在线资源,但没有找到解决方案。

android material-components-android android-jetpack-compose

17
推荐指数
2
解决办法
8690
查看次数

Kotlin 中的对象和数据对象

我在 Sealed 类中编写了这 3 个游戏状态:

sealed class Status {
    object Idle : Status()
    object Active : Status()
    object GameOver : Status()
}
Run Code Online (Sandbox Code Playgroud)

IDE 建议我应该使用 adata object而不是object.

在此输入图像描述

问题是我从来没有听说过data object。我环顾四周,没有找到与 相关的可靠解释data object。例如,这个2015 年的答案表明这是一个错误!

我正在寻找您的想法 data object及其用法。

kotlin

12
推荐指数
1
解决办法
2530
查看次数

测试错误 - NoClassDefFoundError:解析失败:Lorg/hamcrest/Matchers

我正在使用 Espresso 进行仪器测试,但在堆栈跟踪上出现此错误:

在此输入图像描述

该错误是由于缺少类引起的,如下所示:

Caused by: java.lang.ClassNotFoundException: Didn't find class "org.hamcrest.Matchers" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/system/framework/android.test.base.jar", zip file "/data/app/~~vnZzxGNKnS4V6YkEf4falA==/com.example.android.architecture.blueprints.reactive.test-K_x0_yJ0hJeDHaJkDmHXRw==/base.apk", zip file "/data/app/~~oeYx2MgTcILbk-vq_WPx1A==/com.example.android.architecture.blueprints.reactive-0wMHYEe95hx_1cnbdAoZAw==/base.apk"],nativeLibraryDirectories
Run Code Online (Sandbox Code Playgroud)

它首先发生在我在片段测试中添加此代码后:

在此输入图像描述

这些是我在 Gradle 上的相关库:

在此输入图像描述

我有这些进口:

import androidx.fragment.app.testing.launchFragmentInContainer
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.hamcrest.core.IsNot.not
Run Code Online (Sandbox Code Playgroud)

dependencies android gradle android-testing android-espresso

11
推荐指数
3
解决办法
5318
查看次数

PainterResource 抛出 IllegalArgumentException:仅支持 VectorDrawables 和光栅化资源类型

我正在开发一个 Jetpack 项目,该项目使用 Coil Library 从 API 下载图像。

我已确认 API 调用已成功返回有效的图像 URL 和相关数据。我可以使用返回的 URL 在浏览器上查看图像。

这是我的图像可组合项:

@Composable
fun AstroPhoto(picture: AstroPicture) {

    val imgUrl = picture.url.toUri()
            .buildUpon()
            .scheme("https")
            .build()
    
    AsyncImage(model = ImageRequest.Builder(LocalContext.current)
            .data(imgUrl)
            .size(Size.ORIGINAL)
            .crossfade(true).build(),

            placeholder = painterResource(R.drawable.loading_animation),
            contentDescription = picture.title,
            contentScale = ContentScale.Crop,
    )
}
Run Code Online (Sandbox Code Playgroud)

我将上面的图像称为可组合在惰性列中:

....
 Box( ... ) {
            
           LazyColumn(content = {
               
               items(state.astroPictures) {
               
                AstroPhoto(picture = it)
            } })
            
        }
Run Code Online (Sandbox Code Playgroud)

这是我得到的异常:

致命异常:主进程:com.uxstate,PID:31790 java.lang.IllegalArgumentException:仅支持 VectorDrawables 和光栅化资源类型。PNG、JPG 位于 androidx.compose.ui.res.PainterResources_androidKt.loadVectorResource(PainterResources.android.kt:93)

我正在compose_version = '1.1.1'kotlin_version = '1.6.10'. 我的线圈版本是"io.coil-kt:coil-compose:2.1.0" …

android android-jetpack-compose coil

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

底部导航视图 OnNavigationItemSelectedListener 已弃用

我正在按照Material Design尝试 Android 的 BottomNavigationView 实现

但是,在 MainActivity 代码上,我收到一条OnNavigationItemSelectedListener已弃用的警告- 请参阅下面的快照

在此处输入图片说明

尝试使用另一种方法来处理 BottomNavigationView,但我找不到它。

寻求任何有出路的人的帮助,但与此同时,我已将我的 BottomView 的菜单项 ID 与片段目标 ID 进行了匹配,并且我成功实现了导航,但存在无法使用片段名称更新我的工具栏标题的限制。

android android-navigation

9
推荐指数
3
解决办法
2587
查看次数

Modifier.preferredSize 和 Modifier.preferredHeight 的未解析参考

我正在关注这个YouTubeModifier.preferredSize()教程,他们在盒子和间隔可组合项上使用Modifier.preferredHeight()- 所有其他链接的修饰符都很好。

但是 Android Studio 无法识别这两个选项。

这是我正在使用的代码:

Column() {
        var isBlue by remember { mutableStateOf(false) }
        val color = if(isBlue) Color.Blue else Color.Green

        Button(onClick = { isBlue = !isBlue }) {}


        Spacer(modifier = Modifier.preferredHeight(128.dp))
        Box(modifier = Modifier.preferredHeight(128.dp).background(color = color)){}
    }
Run Code Online (Sandbox Code Playgroud)

编辑强调preferredHeight尚未解决。

这是来自 IDE 的透视图。

在此输入图像描述

我正在使用compose_version = '1.0.1'AS Arctic Fox

android android-jetpack-compose

6
推荐指数
2
解决办法
1688
查看次数

将 Compose 语义树打印到日志

我正在关注Jetpack Compose Codelab 中的测试,但无法使用节点上的函数打印语义树。printToLog我在包内使用此代码androidTest

import androidx.compose.ui.test.printToLog 

...

    //testing function
    @Test
    fun rallyTopAppBarTest() {
    
        val allScreen = RallyScreen.values().toList()
        testRule.setContent {
            //the component be tested in isolation goes here
            RallyTopAppBar(
                allScreens = allScreen,
                onTabSelected = {},
                currentScreen = RallyScreen.Accounts
            )
        }
        
        testRule.onRoot().printToLog("currentLabelExists")
        
            ....
    }
Run Code Online (Sandbox Code Playgroud)

我已使用标签检查了我的 LogCat 的调试详细过滤"currentLabelExists",但语义树未打印在日志上。

关于我可能会错过什么的任何想法。

android android-jetpack-compose android-jetpack-compose-testing

6
推荐指数
1
解决办法
5195
查看次数

WorkManager 已触发但返回 Failure 结果

我正在尝试 Android WorkManager,它每 15 分钟就会成功触发一次。

但是,工作尚未完成,我在日志中收到此错误。

I/WM-WorkerWrapper: Worker result FAILURE for Work

在此输入图像描述

这就是我设置Constraints(在应用程序类内部)来触发工作的方式。

 //set-up work
private fun setUpAsteroidLoadingWork() {

    //define work constraints
    val workConstraints =
            Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.UNMETERED)
                    .setRequiresCharging(false)
                    .build()

    //create WorkRequest
    val workRequest = PeriodicWorkRequestBuilder<LoadAsteroidsWorker>(15, TimeUnit.MINUTES)
        .setConstraints(
            workConstraints)
            .build()

    //get WorkManager
    val workManager = WorkManager.getInstance(this)


    //enqueue work
    workManager.enqueueUniquePeriodicWork(
            LoadAsteroidsWorker.WORK_NAME, ExistingPeriodicWorkPolicy.KEEP, workRequest)


}
Run Code Online (Sandbox Code Playgroud)

onCreate()我在应用程序类方法中开始工作

     override fun onCreate() {
        super.onCreate()
        //initialize Timber
        Timber.plant(Timber.DebugTree())
Timber.i("Application's onCreate Called")
        
        //start work inside onCreate
        runWorkInBackground()
    }

    //switch work to run on background
    private …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

5
推荐指数
1
解决办法
3027
查看次数

当文本字段为空时如何禁用软键盘上的 ImeAction/按钮

我有这个 TextFied 可组合项,同时包含KeyboardOptionsKeyboardActions

@Composable
fun TodoInputText(...) {
    val keyboardController = LocalSoftwareKeyboardController.current
    TextField( ....
        onValueChange = onTextChanged,
        keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done),
        keyboardActions = KeyboardActions(onDone = {
            onImeAction()
            keyboardController?.hide()
        }))}
Run Code Online (Sandbox Code Playgroud)

TextField 正在与 Done Action 配合使用,但只要 TextFied 为空,我就需要在键盘上禁用 Done ImeAction,如此 GIF 所示

在此输入图像描述

我已经提取了一个状态来检查 TextField 是否为空。

@Composable
fun TodoItemEntryInput(...) {

    //hold state for TextField
    val (text, setText) = remember { mutableStateOf("") }

    val isTextBlank = text.isNotBlank()

    //declare lambda function submit that handles  a submit event when done is pressed …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose

5
推荐指数
1
解决办法
989
查看次数

使用 Android Studio Database Inspector 清除 ROOM 数据库条目

我正在ROOM Database InspectorAndroid Studio 上进行实验。

使用检查器上的查询清除数据库中的所有条目,而不必卸载然后重新安装应用程序来清除数据。我还知道我可以手动清除 AppData 中的缓存,但我只需要运行一个简单的查询而不是手动清理。

我看到我可以直接从数据库检查器编写查询,但我找不到如何编写查询或要编写的查询。 在此输入图像描述

我还注意到数据库条目只是只读的 在此输入图像描述

有谁知道是否可以使用检查器查询清除/删除数据库。如果是这样,可以使用检查器使用哪个查询来清除数据库中的所有内容

android android-room

5
推荐指数
1
解决办法
1834
查看次数