小编jes*_*nte的帖子

Android 8.0 Oreo在关注TextInputEditText时崩溃

将我们的一些设备更新到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

96
推荐指数
5
解决办法
2万
查看次数

检查特定 LazyColumn 项何时进入视图的有效方法?

我需要检查某个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

13
推荐指数
1
解决办法
6326
查看次数

带有Presenter的RxJava和用于配置更改的保留片段

我是RxJava的新手,并将其与MVP架构结合使用.

我发现了一些关于使用保留片段在配置更改时保存observable的示例(仍然不确定这是否是最好的方法).我发现的例子是直接在Activity或Fragment上处理observable,而不是从Presenter处理.

所以我试验并设置了这个快速示例(仅使用Reactivex的RxJava和RxAndroid lib)来测试,这似乎工作正常.这个例子的作用是:

  1. 使用无头保留片段启动活动.
  2. 按钮
  3. Presenter调用FakeService以获得延迟(5秒)响应的可观察性.
  4. Presenter对此可观察对象执行.cache().
  5. Presenter告诉视图保留此可观察性.
  6. View将可观察对象保存在保留的片段中.
  7. Presenter订阅了observable.
  8. 用户执行配置更改(设备轮换).用户可以根据需要多次执行此操作.
  9. OnPause告诉Presenter的CompositeSubscription清除和取消订阅所有当前订阅.
  10. 重新创建活动并重用现有的保留片段.
  11. Activity的onResume检查保留的片段的存储的observable是否为null.
  12. 如果不为null,则告诉Presenter订阅它.
  13. 保留的observable被订阅,并且因为.cache被调用,它只是将结果重放给新订阅者而不再调用该服务.
  14. 当Presenter向视图显示最终结果时,它还将保留的片段的已保存observable设置为null.

我想知道我是否正确地执行此操作,并且当在Presenter中处理observable的订阅时,是否有更高效或更优雅的方式来处理配置更改?


编辑:感谢您的反馈.基于此,我已经达到了我认为更清洁的解决方案,并且我已经更新了我的链接示例.

随着新的变化; 而不是将Observable从Presenter传递给Activity到retainFragment以存储一个configurationChange事件,我宁愿将retainFragment设置为Presenter创建时的第二个"视图".

这种方式当onResume()在设备旋转后发生时,我不需要让Activity执行将Observable从retainFragment传递回Presenter的丑陋管道.

Presenter可以直接与第二个"视图"进行交互,并检查保留的observable本身并在需要时重新订阅.主要活动不再需要知道这个可观察的.突然间,这是一个更简单的视图层.

mvp android rx-java rx-android

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

即使没有完成用户焦点交互,在初始化时也会调用 Compose TextField Modifier.onFocusChanged {} 事件

可使用代码重现:

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 android-jetpack-compose android-compose-textfield

8
推荐指数
1
解决办法
2246
查看次数

Android Architecture Navigation组件和Proguard结果为java.lang.ClassNotFoundException

当使用新的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

7
推荐指数
0
解决办法
1726
查看次数

设置 AndroidManifest 的活动 screenRotation 每个风味不同

有没有办法从 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 android-manifest build.gradle android-gradle-plugin

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