将我们的一些设备更新到Android 8.0后,在关注a TextInputEditText内部的一个字段后TextInputLayout,应用程序崩溃了Exception:
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.view.View.getBoundsOnScreen(android.graphics.Rect)' on a null object reference
at android.app.assist.AssistStructure$WindowNode.(AssistStructure.java)
at android.app.assist.AssistStructure.(AssistStructure.java)
at android.app.ActivityThread.handleRequestAssistContextExtras(ActivityThread.java:3035)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1807)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Run Code Online (Sandbox Code Playgroud)
当我们进入android 设置 - >系统 - >语言和输入 - >高级 - >自动填充服务 - >无,然后专注于TextInputEditText / TextInputLayout不再崩溃.
如何在不必禁用设备上的新8.0自动填充服务的情况下防止崩溃发生?
android android-edittext android-textinputlayout android-8.0-oreo
我需要检查某个LazyColumn项目何时进入视图,一旦进入,仅回调onItemWithKeyViewed()一次以通知该项目已被查看。我的尝试:
@Composable
fun SpecialList(
someItems: List<Things>,
onItemWithKeyViewed: () -> Unit
) {
val lazyListState = rememberLazyListState()
if (lazyListState.isScrollInProgress) {
val isItemWithKeyInView = lazyListState.layoutInfo
.visibleItemsInfo
.any { it.key == "specialKey" }
if (isItemWithKeyInView) {
onItemWithKeyViewed()
}
}
LazyColumn(
state = lazyListState
) {
items(items = someItems) { itemData ->
ComposableOfItem(itemData)
}
item(key = "specialKey") {
SomeOtherComposable()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的方法的问题是我注意到列表滚动性能严重下降并丢失帧。我意识到这可能是因为它正在检查每一帧上的所有可见项目键?
此外,onItemWithKeyViewed()当前已被多次调用,而不仅仅是第一次查看。
是否有更有效的方法来仅对onItemWithKeyViewed()第一次"specialKey"查看项目进行一次回调?
android android-jetpack-compose android-jetpack-compose-list
我是RxJava的新手,并将其与MVP架构结合使用.
我发现了一些关于使用保留片段在配置更改时保存observable的示例(仍然不确定这是否是最好的方法).我发现的例子是直接在Activity或Fragment上处理observable,而不是从Presenter处理.
所以我试验并设置了这个快速示例(仅使用Reactivex的RxJava和RxAndroid lib)来测试,这似乎工作正常.这个例子的作用是:
我想知道我是否正确地执行此操作,并且当在Presenter中处理observable的订阅时,是否有更高效或更优雅的方式来处理配置更改?
编辑:感谢您的反馈.基于此,我已经达到了我认为更清洁的解决方案,并且我已经更新了我的链接示例.
随着新的变化; 而不是将Observable从Presenter传递给Activity到retainFragment以存储一个configurationChange事件,我宁愿将retainFragment设置为Presenter创建时的第二个"视图".
这种方式当onResume()在设备旋转后发生时,我不需要让Activity执行将Observable从retainFragment传递回Presenter的丑陋管道.
Presenter可以直接与第二个"视图"进行交互,并检查保留的observable本身并在需要时重新订阅.主要活动不再需要知道这个可观察的.突然间,这是一个更简单的视图层.
可使用代码重现:
var value by remember { mutableStateOf("Hello\nWorld\nInvisible") }
TextField(
value = value,
onValueChange = { value = it },
label = { Text("Enter text") },
modifier = Modifier
.onFocusChanged { Log.d("TAG", "1 OnFocusChangedCalled: $it") }
)
TextField(
value = value,
onValueChange = { value = it },
label = { Text("Enter text") },
modifier = Modifier
.onFocusChanged { Log.d("TAG", "2 OnFocusChangedCalled: $it") }
)
Run Code Online (Sandbox Code Playgroud)
只需打开视图,Logcat 就会显示:
D/TAG: 1 OnFocusChangedCalled: Inactive
D/TAG: 2 OnFocusChangedCalled: Inactive
Run Code Online (Sandbox Code Playgroud)
对于传统的 XML 布局,onFocusChangedListener 仅在用户实际与字段交互时触发。
使用撰写布局,仅当用户从文本字段中删除焦点时,我才尝试进行错误验证。
然而,这种行为导致我的验证在视图初始化后立即触发。 …
当使用新的android导航组件运行启用了proguard的版本时,找不到我的片段类。我收到此堆栈跟踪:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myapppackage.path, PID: 24334
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapppackage.path/com.myapppackage.path.MainActivity}: android.view.InflateException: Binary XML file line #10: Binary XML file line #10: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: android.view.InflateException: Binary XML file line #10: Binary XML file line #10: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class …Run Code Online (Sandbox Code Playgroud) android proguard android-fragments android-proguard android-jetpack
有没有办法从 gradle 的 build.config 动态设置 AndroidManifest 中的活动 screenOrientation?
我需要一种允许旋转的风味,以及另一种仅用于肖像的风味。
我已经通读了http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger但他们的例子似乎只适用于普通的字符串标签。
我试过两种方法。
使用 gradle 的 manifestPlaceholders: build.gradle:
productFlavors {
flavorRotation {
manifestPlaceholders = [ROTATION_PREF: "unspecified"]
}
flavorNoRotation {
manifestPlaceholders = [ROTATION_PREF: "portrait"]
}
}
Run Code Online (Sandbox Code Playgroud)
使用 AndroidManifest.xml:
...
<activity android:name=".ui.ActivityName"
android:screenOrientation="${ROTATION_PREF}"/>
...
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,没有给出错误,但是当我构建“flavorNoRotation”时旋转没有锁定到纵向
并尝试使用 gradle 的 resValue: build.gradle:
productFlavors {
flavorRotation {
resValue "string", "orientation", "unspecified"
}
flavorNoRotation {
resValue "string", "orientation", "portrait"
}
}
Run Code Online (Sandbox Code Playgroud)
与清单:
...
<activity android:name=".ui.ActivityName"
android:screenOrientation="@string/orientation"/>
...
Run Code Online (Sandbox Code Playgroud)
这样,它构建得很好,但是当我尝试安装到设备时,它只是失败,Android Studio 给出消息:“安装失败,消息 INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION。如果是,则可以通过卸载现有版本的 apk 来解决此问题存在,然后重新安装。”
单击“确定”只会出现事件日志错误“安装 APK 时出错”。那么,构建类型/口味之间有什么不同的方向吗? …
android ×6
android-jetpack-compose-list ×1
build.gradle ×1
mvp ×1
proguard ×1
rx-android ×1
rx-java ×1