我有一个文本和一个图标可组合项。我希望图标粘在可组合项的右侧。这是我的代码:
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
如果我的 android 项目中有多个模块,并且我在其中 2 个模块中添加了库依赖项(例如 dagger 或 appcompat),那么该库是否会将其大小的两倍添加到最终的 APK 大小中,还是只有一个副本最终 APK 中的库是什么?
另外,如果我在不同的模块中使用不同版本的库,APK 大小会增加多少?
我正在尝试按照官方文档在我的 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) 我正在尝试设置文本字段中最大字符数的限制。这是我尝试过的:
var text by remember { mutableStateOf("") }
val maxLength = 40
TextField(
value = text,
onValueChange = {
text = it.take(maxLength)
}
)
Run Code Online (Sandbox Code Playgroud)
问题是这样的:
如何摆脱这种行为?设置 TextField 文本最大长度的正确方法是什么?
android kotlin android-jetpack-compose android-jetpack-compose-text
我有一个公开事件流的视图模型。我已将 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)来处理事件。
我在我的应用程序中编写了这段代码,一切似乎都正常,但我不确定这是否是一件好事。
我的问题是:
这种方法是否有我遗漏的缺点?这里可能会出现什么问题?
我有一个包含几列的 Room SQL 表。我想向其中添加一列包含布尔值。为了将我的数据库迁移到这个新架构,我尝试使用 Room Auto-Migrations。我的问题是如何更新表中的现有行以获得false这个新添加的列的值?我是否必须通过更改表并将默认值插入到所有行来回退到编写手动迁移?
将 Android Studio 更新到 4.1 版后,Git Tool 现在将我所有的 kotlin 和 xml 文件显示为 C++ 文件。
我附上了一张相同的截图。
知道如何解决这个问题还是新版本的错误?

我试图使用字段注入在我的片段中注入一个类,当我尝试在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()在注入之前调用,有时在注入之后调用。
我需要使用以下 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) 我正在尝试将基于视图的代码转换为 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
android ×10
kotlin ×9
android-jetpack-compose-layout ×1
android-jetpack-compose-text ×1
android-room ×1
dagger-2 ×1
dagger-hilt ×1
git ×1
google-play ×1
gradle ×1
json ×1
moshi ×1
retrofit2 ×1
sql ×1