小编Arp*_*kla的帖子

如何对齐文本和图标可组合项,以便即使文本溢出后它们也能保持在一起?

我有一个文本和一个图标可组合项。我希望图标粘在可组合项的右侧。这是我的代码:

Row(
    verticalAlignment = Alignment.CenterVertically,
    horizontalArrangement = Arrangement.Center,
    modifier = Modifier
        .fillMaxWidth()
        .padding(horizontal = 16.dp)
) {
    Text(
        text = subjectName,
        maxLines = 1,
        overflow = TextOverflow.Ellipsis,
        textAlign = TextAlign.Center,
    )
    Icon(
        painter = painterResource(id = R.drawable.ic_arrow_drop_down),
        contentDescription = null
    )
}
Run Code Online (Sandbox Code Playgroud)

对应的UI是:

这看起来不错,但是当文本太长并且出现溢出时,图标会像这样脱离屏幕:

相反,我想让它看起来像这样:

我尝试给Text可组合项一个weight(1f)修饰符,以便将图标放在第一位。现在,溢出的文本看起来很好,但是当文本较短时,图标仍然放置在末尾,因为文本占据了整个剩余宽度:

我如何在这里获得所需的 UI(图 1 和 3)?

android kotlin android-jetpack-compose android-jetpack-compose-layout

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

将相同的库依赖项添加到不同的 Android gradle 模块是否会增加 APK 大小?

如果我的 android 项目中有多个模块,并且我在其中 2 个模块中添加了库依赖项(例如 dagger 或 appcompat),那么该库是否会将其大小的两倍添加到最终的 APK 大小中,还是只有一个副本最终 APK 中的库是什么?

另外,如果我在不同的模块中使用不同版本的库,APK 大小会增加多少?

android gradle kotlin

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

如何处理应用内更新中的InstallException?

我正在尝试按照官方文档在我的 Android 应用程序中实现应用程序内更新。我使用内部测试轨道在 Play 商店上启动了我的应用程序的一个版本,然后是版本代码递增的另一个版本。

当我第一次打开应用程序时,它崩溃了,并出现以下异常:

Fatal Exception: com.google.android.play.core.install.InstallException: Install Error(-10): The app is not owned by any user on this device. An app is "owned" if it has been acquired from Play. (https://developer.android.com/reference/com/google/android/play/core/install/model/InstallErrorCode#ERROR_APP_NOT_OWNED)
       at com.google.android.play.core.appupdate.o.a(o.java:6)
       at com.google.android.play.core.internal.o.a(o.java:28)
       at com.google.android.play.core.internal.j.onTransact(j.java:20)
       at android.os.Binder.execTransactInternal(Binder.java:1166)
       at android.os.Binder.execTransact(Binder.java:1130)
Run Code Online (Sandbox Code Playgroud)

但是当我重新打开应用程序时,更新流程正常启动。因此,也许 PlayCore 库第一次无法获取正确的数据,并且抛出了InstallException.

我想要的是捕获所有此类InstallException,但我无法找到放置 try-catch 块的确切位置。哪个函数AppUpdateManager抛出这个InstallException?是startUpdateFlow()方法吗?

我的代码:

private lateinit var updateInfo: AppUpdateInfo

suspend fun checkForUpdate() {
    updateInfo = appUpdateManager.requestAppUpdateInfo() // suspend function from play-core-ktx …
Run Code Online (Sandbox Code Playgroud)

android kotlin google-play in-app-update google-play-core

6
推荐指数
0
解决办法
664
查看次数

设置文本最大长度时撰写文本字段的奇怪行为

我正在尝试设置文本字段中最大字符数的限制。这是我尝试过的:

var text by remember { mutableStateOf("") }
val maxLength = 40
TextField(
    value = text,
    onValueChange = {
        text = it.take(maxLength)
    }
)
Run Code Online (Sandbox Code Playgroud)

问题是这样的:

  • 当我超过限制时,整个文本突然被清除。
  • 这种情况只发生一次,即当我重新输入并超出限制时,它就停在那里(这是所需的行为)
  • 40 在这里似乎是一个神奇的数字,因为对于 maxLength = 39 或更低,一切正常。当我将限制设置为 40 或更高时,我看到了这种奇怪的行为。(这个神奇的数字似乎并不取决于文本字段宽度,因为我尝试了纵向和横向模式,结果是相同的)

如何摆脱这种行为?设置 TextField 文本最大长度的正确方法是什么?

在此输入图像描述

android kotlin android-jetpack-compose android-jetpack-compose-text

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

可以将 Flow 从一个可组合项传递到另一个可组合项吗?

我有一个公开事件流的视图模型。我已将 viewModel 注入到顶级可组合项中,但我想将事件发送到另一个可组合项(在顶级可组合项内)。像这样的东西:

@Composable
fun MainScreen(viewModel: MyViewModel) {
    SomeComponent(viewModel.events) 
    // Other Stuff   
}

@Composable
fun SomeComponent(events: Flow<MyEvent>) { // MyEvent is a sealed class
    LaunchedEffect(Unit) {
        events.collect {
            // Process the events
        }
    }
    // Other stuff
}
Run Code Online (Sandbox Code Playgroud)

SomeComponent我收集流而不收集流的原因MainScreen是因为我需要访问某些内部状态SomeComponent(实际上是 ScaffoldState)来处理事件。

我在我的应用程序中编写了这段代码,一切似乎都正常,但我不确定这是否是一件好事。
我的问题是:
这种方法是否有我遗漏的缺点?这里可能会出现什么问题?

android kotlin android-jetpack-compose

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

如何为使用房间自动迁移创建的新列的现有行设置默认值?

我有一个包含几列的 Room SQL 表。我想向其中添加一列包含布尔值。为了将我的数据库迁移到这个新架构,我尝试使用 Room Auto-Migrations。我的问题是如何更新表中的现有行以获得false这个新添加的列的值?我是否必须通过更改表并将默认值插入到所有行来回退到编写手动迁移?

sql android database-migration kotlin android-room

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

Android Studio Git 工具显示错误的文件类型

将 Android Studio 更新到 4.1 版后,Git Tool 现在将我所有的 kotlin 和 xml 文件显示为 C++ 文件。

我附上了一张相同的截图。

知道如何解决这个问题还是新版本的错误?

git android android-studio

5
推荐指数
0
解决办法
116
查看次数

Dagger 刀柄错误“lateinit 属性尚未初始化”

我试图使用字段注入在我的片段中注入一个类,当我尝试在onViewCreated(). 我怎样才能解决这个问题?

我试图注入的类:

@Singleton
class DialogHandler @Inject constructor() {

    private var currentDialogKey = "dialog_key"
    //....
    //....
}
Run Code Online (Sandbox Code Playgroud)

我的片段:

@AndroidEntryPoint
class AccountFragment : Fragment(R.layout.fragment_account) {

    @Inject
    lateinit var dialogHandler: DialogHandler

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val currentDialogKey = dialogHandler.currentDialogKey // throws error saying dialogHandler is uninitialized
        //....
        //....
    }
}
Run Code Online (Sandbox Code Playgroud)

Hilt 已在应用程序中正确设置,并且在其他类中的构造函数注入中工作正常。但由于片段无法实现构造函数注入,因此我尝试使用字段注入并收到此错误。
请帮忙。

编辑:此异常并非每次都会发生。因此,这似乎是一种竞争条件的情况,有时onViewCreated()在注入之前调用,有时在注入之后调用。

android dependency-injection kotlin dagger-2 dagger-hilt

5
推荐指数
0
解决办法
2934
查看次数

如何在使用 Retrofit + Moshi 时为 json 键指定不同的名称

我需要使用以下 json 向后端发出 POST 请求:

{
    start_time: 123456789
}
Run Code Online (Sandbox Code Playgroud)

我在 Retrofit 请求中为主体创建了以下数据类:

{
    start_time: 123456789
}
Run Code Online (Sandbox Code Playgroud)

但是当我检查后端时,请求包含该startTime字段而不是start_time. 如何更改此变量的名称以进行 json 序列化?

编辑:我的build.gradle:

implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-moshi:2.9.0"
Run Code Online (Sandbox Code Playgroud)

我的api接口:

data class MyRequestBody(
    @Json(name="start_time")
    val startTime: Long
)
Run Code Online (Sandbox Code Playgroud)

改造建造者:

implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-moshi:2.9.0"
Run Code Online (Sandbox Code Playgroud)

android json kotlin moshi retrofit2

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

如何旋转可组合项并向旋转添加进度侦听器?

我正在尝试将基于视图的代码转换为 Compose。我有一个可组合项,它将图像(Painter)作为参数并使用图像可组合项显示它。我想要的是,每当参数值发生变化时,我的图像应该进行 360 度旋转,并且图像应该在角度大约变化时发生变化。180度(即动画中途)

这是我制作的可组合项。

@Composable
fun MyImage(displayImage: Painter) {
    Image(
        painter = displayImage,
        contentDescription = null,
        modifier = Modifier
            .size(36.dp)
            .clip(CircleShape)
    )
}
Run Code Online (Sandbox Code Playgroud)

现在,当displayImage发生变化时,新图像会立即显示,没有任何动画(显然)。如何才能实现想要的动画效果呢?

我尝试转换的代码如下所示:

fun onImageChange(imageRes: Int) {
    ObjectAnimator.ofFloat(imageView, View.ROTATION, 0f, 360f)
        .apply {
            addUpdateListener {
                if (animatedFraction == 0.5f) {
                    imageView.setImageResource(imageRes)
                }
            }
            start()
        }
}
Run Code Online (Sandbox Code Playgroud)

android android-animation kotlin android-jetpack-compose jetpack-compose-animation

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