可访问性字体更改不会保留视图可见性

accessibility font change does not preserve the view visibility

如果我们将辅助功能字体从大变小或从小变大然后返回到应用程序,视图的可见性将不会保留;这意味着如果视图在应用程序中不可见或消失,并且字体大小在辅助功能中更改并返回到应用程序,我们将看到该视图可见。

示例,

class MainActivity : AppCompatActivity(R.layout.activity_main) {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        findViewById<Button>(R.id.b3).setOnClickListener {
            findViewById<Button>(R.id.b2).visibility = GONE
        }
    }
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <Button
        android:id="@+id/b1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="something" />

    <Button
        android:id="@+id/b2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="something big" />

    <Button
        android:id="@+id/b3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="click"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/layout" />
</LinearLayout>

现在,点击“点击”按钮,进入设置->辅助功能->字体->更改,然后返回应用程序。隐藏的按钮再次可见。

除了将值保留在其他变量中并稍后设置外,是否有任何解决方法?

Now, click on the "click" button and go to setting->accessibility->font->CHANGE and come back the app. The hidden button is visible again.

您正在进行配置更改。有很多很多配置更改,例如:

  • 方向更改(适用于支持纵向和横向的应用)
  • Enable/disable暗模式
  • Locale/language 变化
  • Window 调整大小(适用于分屏和自由格式多 window 环境)
  • 字体比例更改或密度比例(“屏幕缩放”)更改
  • 以此类推

Is there any workaround other than keeping the values in other variables and set that later?

一般来说,那也行不通。您现有的 activity 正在被销毁并重新创建。当旧 activity 消失时,旧 activity 中的任何字段都会消失。

The documentation 涵盖了配置更改,任何关于 Android 应用程序开发的好书或课程也是如此。您的主要选择是:

  • 使用保存的实例状态 BundleViewModel 保存数据,然后您可以在新的 activity 中使用这些数据来恢复您的 UI 配置更改后应处于的任何状态;或

  • 选择退出配置更改并自行处理所有 UI 更新(例如,将所有显示的文本设置为新语言以进行区域设置更改)

前者是基于经典 View 的 UI 开发的典型方法,正如您所做的那样。后者在 Jetpack Compose 中越来越受欢迎,Jetpack Compose 将配置更改作为其现有重组系统的一部分进行处理。