9.0 原生setting 默认应用手机助手显示异常

问题:

进入设置应用和通知>默认应用>助手和手机输入助手应用

进入助手应用,选择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做了处理.

发布了67 篇原创文章 · 获赞 42 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/w1764662543/article/details/86509713
今日推荐