gpt4 book ai didi

android - 如何知道 Activity 上的哪个配置已更改?

转载 作者:行者123 更新时间:2023-12-05 07:53:17 27 4
gpt4 key购买 nike

onConfigurationChanged 方法在配置发生任何变化时由系统在 Activity 上调用。只有在 list 中由 configChanges 属性定义的那些配置才会调用此方法。

我在此 configChanges 属性中定义了多个配置 (orientation|screenSize),我想检测哪些配置已更改,以便我可以根据该更改做一些工作,如何我能做到吗?

为了解决这个问题,我有以下代码 fragment :

public class MyActivity extends AppCompatActivity {
private final String TAG = "my-activity";

private Configuration prevConfig;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Override
protected void onResume () {
super.onResume();
prevConfig = new Configuration(getResources().getConfiguration());
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int diff = newConfig.diff(prevConfig);

if(((diff & ActivityInfo.CONFIG_ORIENTATION) != 0)
|| ((diff & ActivityInfo.CONFIG_SCREEN_SIZE) != 0)) {
Log.d(TAG, "Orientation or Screen size has been changed.");
}

// other configuration change checking goes here

prevConfig = new Configuration(newConfig);
}
}

通过这个我可以检测到哪个配置已被更改。

我想知道这是否是实现目标的最佳方式?

最佳答案

How to know which configuration has been changed on an Activity?

为了简化问题。如果您不想在配置更改时自行控制,则不必在 AndroidManifest.xml 中定义 configChanges

我使用的方法只是重写onSaveInstanceState 来存储 Activity 被杀死之前的配置,然后将其恢复到像您这样的属性作为prevConfig。因为 android.content.res.Configuration 是一种 Parcelable。通过调用 putParcelable 将其放入 Bundle 并在 onCreate 上恢复它非常容易。

这样,您将在onCreate() 中获得两个Configuration。您从 Bundle savedInstanceState 中获取前一个,而当前从 Activity.getResources().getConfiguration() 中获取。 Configuration 有一个公共(public)方法 diff ,我们可以用它来返回它们之间差异的位掩码。

对我来说,最重要的是如何轻松区分位掩码。还好有个method从官方 repo 我们可以引用。它是静态的,也是公开的。但是由于JavaDoc中的hide注解,我们无法调用它。因此,我的第一个尝试是使用反射来调用该方法。由于发生异常,该方法似乎已从 Android 运行时中完全删除。看了源码后。我只是将其复制到我自己的来源。应对似乎是个坏主意。但是,再一次。它是一个公共(public)静态方法,因此复制起来不太困难,易于维护。

这是我用 Kotlin 编写的解决方案。

package com.example.android.configchangeapp

import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity

class MainActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val config = resources.configuration
val prevConfig = savedInstanceState?.getParcelable<Configuration>("config")
if (prevConfig != null) {
val diff = config.diff(prevConfig)
val diffString = configurationDiffToString(diff)
Log.d(TAG, "diff: $diffString")
}
}

override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putParcelable("config", resources.configuration)
}

companion object {
const val TAG = "MainActivity"

fun configurationDiffToString(diff: Int): String {
val list = ArrayList<String>()
if (diff and ActivityInfo.CONFIG_MCC != 0) {
list.add("CONFIG_MCC")
}
if (diff and ActivityInfo.CONFIG_MNC != 0) {
list.add("CONFIG_MNC")
}
if (diff and ActivityInfo.CONFIG_LOCALE != 0) {
list.add("CONFIG_LOCALE")
}
if (diff and ActivityInfo.CONFIG_TOUCHSCREEN != 0) {
list.add("CONFIG_TOUCHSCREEN")
}
if (diff and ActivityInfo.CONFIG_KEYBOARD != 0) {
list.add("CONFIG_KEYBOARD")
}
if (diff and ActivityInfo.CONFIG_KEYBOARD_HIDDEN != 0) {
list.add("CONFIG_KEYBOARD_HIDDEN")
}
if (diff and ActivityInfo.CONFIG_NAVIGATION != 0) {
list.add("CONFIG_NAVIGATION")
}
if (diff and ActivityInfo.CONFIG_ORIENTATION != 0) {
list.add("CONFIG_ORIENTATION")
}
if (diff and ActivityInfo.CONFIG_SCREEN_LAYOUT != 0) {
list.add("CONFIG_SCREEN_LAYOUT")
}
if (diff and ActivityInfo.CONFIG_COLOR_MODE != 0) {
list.add("CONFIG_COLOR_MODE")
}
if (diff and ActivityInfo.CONFIG_UI_MODE != 0) {
list.add("CONFIG_UI_MODE")
}
if (diff and ActivityInfo.CONFIG_SCREEN_SIZE != 0) {
list.add("CONFIG_SCREEN_SIZE")
}
if (diff and ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE != 0) {
list.add("CONFIG_SMALLEST_SCREEN_SIZE")
}
if (diff and ActivityInfo.CONFIG_DENSITY != 0) {
list.add("CONFIG_DENSITY")
}
if (diff and ActivityInfo.CONFIG_LAYOUT_DIRECTION != 0) {
list.add("CONFIG_LAYOUT_DIRECTION")
}
if (diff and ActivityInfo.CONFIG_FONT_SCALE != 0) {
list.add("CONFIG_FONT_SCALE")
}
if (diff and ActivityInfo.CONFIG_FONT_WEIGHT_ADJUSTMENT != 0) {
list.add("CONFIG_AUTO_BOLD_TEXT")
}

return buildString {
append("{")
append(list.joinToString(", "))
append("}")
}
}
}
}

关于android - 如何知道 Activity 上的哪个配置已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32807137/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com