问题:
进入设置应用和通知>默认应用>助手和手机输入助手应用
进入助手应用,选择none,退到上一个界面,原来显示"使用屏幕上的文字内容"消失.然后切换横竖屏,在进入手机助手显示Google助理,退回上一个界面."使用屏幕上的文字内容"这个设置项没有出现,只有在横竖屏切换一次才会出现.
问题点:选择Google助理退回上一个界面,"使用屏幕上的文字内容"这个设置项就应该立刻显示出来.
先看修改:
private void updatePreference() {
if (mPreference == null || !(mPreference instanceof TwoStatePreference)) {
return;
}
if (isAvailable()) {
if (mScreen.findPreference(getPreferenceKey()) == null) {
// add it if it's not on scree
mScreen.addPreference(mPreference);
+ setVisible(mScreen, getPreferenceKey(), true /* visible */);
+ if (this instanceof Preference.OnPreferenceChangeListener) {
+ mPreference.setOnPreferenceChangeListener(
+ (Preference.OnPreferenceChangeListener) this);
+ }
}
} else {
mScreen.removePreference(mPreference);
}
((TwoStatePreference) mPreference).setChecked(isChecked(mContext));
}
再分析原因:
分析:
- 在android Setting 横竖屏切换的时候会重新更新AbstractPreferenceController的
displayPreference的方法, - AbstractPreferenceController在开始更新数据会调用
updateState->displayPreference, - 面更新只有调用updateState,
如果在displayPreference像下面一样调用了 super.displayPreference(screen);且此时isAvailable返回false;会导致后面add这个preferecen在界面上不会显示.
@Override
public void displayPreference(PreferenceScreen screen) {
mScreen = screen;
mPreference = screen.findPreference(getPreferenceKey());
super.displayPreference(screen);//0
}
因为android 9的AbstractPreferenceController的类displayPreference是这样写的(对应上面的0).
public void displayPreference(PreferenceScreen screen) {
final String prefKey = getPreferenceKey();
if (isAvailable()) {
setVisible(screen, prefKey, true /* visible */);//1
if (this instanceof Preference.OnPreferenceChangeListener) {
final Preference preference = screen.findPreference(prefKey);
preference.setOnPreferenceChangeListener(
(Preference.OnPreferenceChangeListener) this);
}
} else {
setVisible(screen, prefKey, false /* visible */);//2
}
}
设置1和2 设置了不可见和不可见.后面更新addPreference后,如果没有设置会可见状态,设置中是不会显示这个设置项的
private void updatePreference() {
if (mPreference == null || !(mPreference instanceof TwoStatePreference)) {
return;
}
if (isAvailable()) {
if (mScreen.findPreference(getPreferenceKey()) == null) {
// add it if it's not on scree
mScreen.addPreference(mPreference);//3
}
} else {
mScreen.removePreference(mPreference);
}
((TwoStatePreference) mPreference).setChecked(isChecked(mContext));
}
3处addPreference后,对应的设置项并没有出现,因为之前在1处设置,但是更新的时候不重新调用displayPreference,
疑问:为什么不显示preference设置项隐藏需要有removePreference和setVisible两种操作.
如果要避免这个问题,就要在addPreference重新设置setVisible为true
AbstractPreferenceController这是android 9的frameworks下,对比android 8,这个的操作不能理解,考虑到这里是系统部分的东西,所以我只在Setting做了处理.