【问题标题】:onPreferenceStartScreen() is never called in PreferenceFragmentCompat on Android在 Android 上的 PreferenceFragmentCompat 中永远不会调用 onPreferenceStartScreen()
【发布时间】:2020-08-25 13:01:14
【问题描述】:

关于stackoverflow的第一个问题,如有不一致之处,请见谅。

我的 Android 应用实现了一个 PreferenceFragmentCompat 片段,该片段通过单击 MainActivity 中的按钮打开。 “root”PreferenceScreen 中的所有选项都可以正常工作,但我无法打开任何“子”PreferenceScreen。

经过大量搜索,我发现需要在我的片段中实现 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

不应在 onNavigateToScreen 之后立即调用 onPreferenceStartScreen。 我做错了什么?

感谢您的帮助!

【问题讨论】:

    标签: android androidx preferencefragment


    【解决方案1】:

    你需要重写PreferenceFragment方法getCallbackFragment,像这样

    @Override
    public Fragment getCallbackFragment() {
        return this;
    }
    

    【讨论】:

    • 谢谢@oeger,真不敢相信这么容易。我可以发誓我以前试过这个,但它成功了。非常感谢!
    猜你喜欢
    • 2020-02-13
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多