在Android上的PreferenceFragmentCompat中从未调用过onPreferenceStartScreen()。

问题描述 投票:3回答:1

第一次在stackoverflow上提问,不一致的地方请见谅。

我的Android应用实现了一个PreferenceFragmentCompat片段,该片段通过MainActivity中的按钮点击打开。在 "根 "PreferenceScreen中的所有选项都能顺利工作,但我无法打开任何 "子 "PreferenceScreens。

经过大量的搜索,我发现有必要在我的片段中实现onPreferenceStartScreen回调,而且它确实工作了!但现在,我做了不少工作。但现在,我对应用做了不少修改,一定是把什么东西搞坏了,但又想不出来。

所以就这样吧!

其中,我在我的应用层gradle.build中实现了这两个库。

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.preference:preference:1.1.1'

这是我测试的pref3.xml。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:defaultValue="false"
        android:key="check_box_preference_1"
        android:title="Check box preference" />
    <PreferenceScreen android:title="Preference Screen">
        <CheckBoxPreference
            android:defaultValue="false"
            android:key="check_box_preference_2"
            android:title="Check box preference" />
    </PreferenceScreen>
</PreferenceScreen>

这是我的测试java Preferences片段(Common.log是我的实用程序记录器方法)

public class TestPrefFrag extends PreferenceFragmentCompat implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
    private static final String TAG = "TestPrefFrag";

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        Common.log(5, TAG, "onCreatePreferences: started");
        setPreferencesFromResource(R.xml.prefs3, rootKey);

    }

    @Override
    public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen preferenceScreen) {
        Common.log(5, TAG, "onPreferenceStartScreen: '" + caller.getTag() + "' called for key '" + preferenceScreen.getKey() + "'");
        caller.setPreferenceScreen(preferenceScreen);
        return true;
    }

    @Override
    public void onNavigateToScreen(PreferenceScreen preferenceScreen) {
        Common.log(5, TAG, "onNavigateToScreen: called for key '" + preferenceScreen.getKey() + "'");
        //getCallbackFragment();
        super.onNavigateToScreen(preferenceScreen);
    }

    @Override
    public boolean onPreferenceTreeClick(Preference preference) {
        Common.log(5, TAG, "onPreferenceTreeClick: detected click @ '" + preference.getKey() + "'");
        return super.onPreferenceTreeClick(preference);
    }
}

当我运行这个

  • 点击根屏幕中的CheckBoxPreference,就会调用onPreferenceTreeClick 只是
  • 点击根屏幕中的PreferenceScreen,会调用 onNavigateToScreen 而后 onPreferenceTreeClick 却不 onPreferenceStartScreen

不应该 onPreferenceStartScreen 紧接着 onNavigateToScreen.我到底做错了什么?

谢谢大家的帮助!

android androidx preferencefragment
1个回答
1
投票

你需要覆盖 PreferenceFragment 办法 getCallbackFragment,像这样

@Override
public Fragment getCallbackFragment() {
    return this;
}
© www.soinside.com 2019 - 2024. All rights reserved.