我想用新的架构组件创建一个应用程序,我已经设置了视图和ViewModel.目前,我的应用程序在ViewModel中执行所有Firestore查询,并且它在某种程度上有效.Google建议您提供一个存储库,用于缓存某些数据并决定是否获取新数据.这对我的应用程序非常有意义,因为我的MainActivity中嵌套了几个Fragment以及许多其他活动.
我决定实现存储库并为我的存储库创建了一个Kotlin对象(Singleton).因此,我收到警告,我不应该在其中存储FirebaseFirestore实例,因为它包含一个Context字段(我需要一个实例来分配snapshotListeners).
Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)
Run Code Online (Sandbox Code Playgroud)
我完全理解这个警告,但我想知道我应该如何在我的应用程序中使用Firebase实现Repository模式而不会有导致内存泄漏的危险?由于Firebase和新的Architecure组件/ Guidlines都来自谷歌,我认为它们的设计可以协同工作,但经过一些研究后我无法弄明白.
有谁知道使用Firebase snapshotListeners实现存储库的有效方法?
我的Android Studio布局编辑器无法正常工作。在对布局进行更改之后,预览始终会消失并变成完全白屏或冻结(我无法选择任何元素,并且对xml文件所做的更改不可见)。这在任何布局文件中都会发生。使chach无效并重新启动后,我可以再次工作,但是在进行其他更改之后,我又遇到了同样的问题。执行干净的构建也无济于事。
布局编辑器显示以下异常:
java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at android.animation.PropertyValuesHolder_Delegate.callMethod(PropertyValuesHolder_Delegate.java:108)
at android.animation.PropertyValuesHolder_Delegate.nCallFloatMethod(PropertyValuesHolder_Delegate.java:143)
at android.animation.PropertyValuesHolder.nCallFloatMethod(PropertyValuesHolder.java)
at android.animation.PropertyValuesHolder.access$400(PropertyValuesHolder.java:38)
at android.animation.PropertyValuesHolder$FloatPropertyValuesHolder.setAnimatedValue(PropertyValuesHolder.java:1387)
at android.animation.ObjectAnimator.animateValue(ObjectAnimator.java:990)
at android.animation.ValueAnimator.animateBasedOnTime(ValueAnimator.java:1339)
at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1471)
at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:146)
at android.animation.AnimationHandler.access$100(AnimationHandler.java:37)
at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:54)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:947)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer_Delegate.doFrame(Choreographer_Delegate.java:66)
at com.android.layoutlib.bridge.impl.RenderSessionImpl.renderAndBuildResult(RenderSessionImpl.java:563)
at com.android.layoutlib.bridge.impl.RenderSessionImpl.render(RenderSessionImpl.java:425)
at com.android.layoutlib.bridge.BridgeRenderSession.render(BridgeRenderSession.java:120)
at com.android.ide.common.rendering.api.RenderSession.render(RenderSession.java:151)
at com.android.ide.common.rendering.api.RenderSession.render(RenderSession.java:133)
at com.android.tools.idea.rendering.RenderTask.lambda$null$8(RenderTask.java:755)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
但是我无法理解发生了什么。我什至不确定这个错误是否是我的问题的原因。也许你可以帮忙。
注意:我正在使用Theme.MaterialComponents.Light.NoActionBar …
在 Jetpack Compose 中构建一个简单的键盘相当简单明了。
编辑:工作示例:https ://github.com/THEAccess/compose-keyboard-ime
我用这个构建了一个非常简单的 KeyRow:
密钥.kt
@Composable
fun Key(modifier: Modifier = Modifier, label: String, onClick: () -> Unit) {
val shape = RoundedCornerShape(4.dp)
//TODO: make clickable outside but don't show ripple
Box(modifier = modifier
.padding(2.dp)
.clip(shape)
.clickable(onClick = onClick)
.background(Color.White)
.padding(vertical = 12.dp, horizontal = 4.dp), contentAlignment = Alignment.Center) {
Text(text = label, fontSize = 20.sp)
}
}
Run Code Online (Sandbox Code Playgroud)
关键行.kt
@Composable
fun KeyRow(keys: List<String>) {
Row(modifier = Modifier.fillMaxWidth().background(color = grey200)) {
keys.forEach {
Key(modifier = Modifier.weight(1f), label …Run Code Online (Sandbox Code Playgroud) 我在 Jetpack Compose 中开发了一个非常复杂的键盘布局。最初,布局工作正常,按下按键时动画运行非常流畅。不幸的是,由于事件的一些重新组合后,动画和一切变得非常缓慢和滞后。我曾尝试对 Java 方法调用进行采样,但我只能看到某些函数比平时花费的时间要长得多。
编辑:
我已经能够隔离问题。我发现性能问题只出现在多模块项目中。当我在根模块中放入完全相同的撰写代码时,app问题就消失了。
我创建了一个重现该问题的项目:
如果你想在多模块项目中重现这个问题,你必须多次在类别之间切换,然后一切都会变得非常滞后
注意:我知道 Jetpack Compose 仍处于 alpha 阶段,这个问题可能是 Jetpack Compose 中的一个错误。但我想确保这不是我的代码错误或 Compose 的一般限制
如何在 Jetpack Compose 中模糊背景或创建模糊叠加?没有任何关于此主题的文档或资源。简单地说:我在寻找实现像这样在Jetpack的撰写本身
出于各种原因,aText应该始终至少具有等于x文本行的高度,无论它的文本行数是否少于 x 行。在Text和BasicTextComposable组件只有一个maxLines参数,但没有minLines
我尝试了以下(x = 3):
Text(
modifier = Modifier.sizeIn(minHeight = with(LocalDensity.current) {
(42*3).sp.toDp()
}),
color = MaterialTheme.colors.onPrimary,
text = "Sample", textAlign = TextAlign.Center,
style = MaterialTheme.typography.h2 /* fontSize = 42 */,
lineHeight = 42.sp
)
Run Code Online (Sandbox Code Playgroud)
结果高度小于如果文本包含 3 行
回到 View World Android,我们可以简单地使用minLines=3,我们如何在 Jetpack Compose 中实现这一点?
我想实现一个可以显示两个不同底部工作表的屏幕。由于ModalBottomSheetLayout只有一个片槽我决定改变sheetContent的ModalBottomSheetLayout动态使用selected状态时我要显示或者在两个片材(的全码)。
val sheetState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden)
val (selected, setSelected) = remember(calculation = { mutableStateOf(0) })
ModalBottomSheetLayout(sheetState = sheetState, sheetContent = {
when (selected) {
0 -> Layout1()
1 -> Layout2()
}
}) {
Content(sheetState = sheetState, setSelected = setSelected)
}
Run Code Online (Sandbox Code Playgroud)
这适用于非常相似的工作表,但是一旦您向两个工作表布局中的任何一个添加更多复杂性,第一次按下按钮时工作表将不会显示,它只会在您按下按钮两次后显示可以在这里看到:

我尝试使用以下代码使用 Jetpack Compose 制作全屏对话框:
Dialog(onDismissRequest = { /*TODO*/ }) {
NewPostDialog()
}
Run Code Online (Sandbox Code Playgroud)
它最终看起来像这样。如何去除侧面的边距(标记为红色)?

在 Jetpack Compose 中,clickableModifier 将默认使用LocalIndication.current并显示绑定到边框的波纹。这几乎总是看起来很棒,但在某些情况下,圆形、无约束的波纹看起来更好。回到 View Android,我们会用它android:background="?attr/selectableItemBackgroundBorderless来实现这种行为。我们如何在撰写中做到这一点?
示例[来源]:

如此处所述,我能够使用 Jetpack Compose 创建键盘。现在,在我将项目从 升级alpha-11到alpha-12代码损坏(并且仍然损坏beta-01)之后,每当我尝试打开键盘时,都会收到以下错误:
java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from DecorView@aaf805f[InputMethod]
at androidx.compose.ui.platform.WindowRecomposer_androidKt.createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:214)
at androidx.compose.ui.platform.WindowRecomposer_androidKt.access$createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:1)
at androidx.compose.ui.platform.WindowRecomposerFactory$Companion$LifecycleAware$1.createRecomposer(WindowRecomposer.android.kt:98)
at androidx.compose.ui.platform.WindowRecomposerPolicy.createAndInstallWindowRecomposer$ui_release(WindowRecomposer.android.kt:151)
at androidx.compose.ui.platform.WindowRecomposer_androidKt.getWindowRecomposer(WindowRecomposer.android.kt:199)
at androidx.compose.ui.platform.AbstractComposeView.ensureCompositionCreated(ComposeView.android.kt:176)
at androidx.compose.ui.platform.AbstractComposeView.onAttachedToWindow(ComposeView.android.kt:207)
at android.view.View.dispatchAttachedToWindow(View.java:20105)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3430)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2052)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1745)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7768)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:967)
at android.view.Choreographer.doCallbacks(Choreographer.java:791)
at android.view.Choreographer.doFrame(Choreographer.java:726)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:940)
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为我已经在 …
我正在使用 InputMethodService、Keyboard 和 KeyboardView(我知道,它最近已被弃用)来创建自定义键盘。
override fun onCreateInputView(): View {
view = layoutInflater.inflate(
R.layout.keyboard_view_test,
null
)
keyboardView =
view.findViewById<KeyboardView>(R.id.keyboard)
keyboard = Keyboard(this, R.xml.keyboard_layout)
keyboardView.keyboard = keyboard
keyboardView.isPreviewEnabled = false
keyboardView.setOnKeyboardActionListener(this)
return keyboardView
}
Run Code Online (Sandbox Code Playgroud)
当使用 Keyboard_view_test.xml 中的 KeyboardView 作为根元素时,键盘工作得非常好。当我开始将它包装在 LinearLayout 或任何其他 ViewGroup 中而不更改任何其他内容时(请参阅keyboard_view_test.xml),我得到一个 IllegalStateException。我不明白,堆栈跟踪没有引用我的任何代码。我怎样才能让它发挥作用?
键盘视图测试.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorGboardBackground">
<android.inputmethodservice.KeyboardView
android:id="@+id/keyboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorGboardBackground"
android:keyBackground="@drawable/key_background"
android:keyPreviewLayout="@layout/key_preview"
android:keyPreviewOffset="10dp"
android:keyTextColor="@color/colorGboardKeyText"
android:keyTextSize="22sp"
android:labelTextSize="22sp"
android:shadowRadius="0" />
Run Code Online (Sandbox Code Playgroud)
该错误似乎发生在 onCreateInputView() 返回后
错误堆栈:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on …Run Code Online (Sandbox Code Playgroud) android android-softkeyboard android-input-method android-viewgroup