android - 在 Android 上的 PreferenceFragmentCompat 中永远不会调用 onPreferenceStartScreen()

标签 android androidx preferencefragment

关于stackoverflow的第一个问题,请原谅任何不一致之处。

我的 Android 应用程序实现了一个 PreferenceFragmentCompat fragment ,该 fragment 通过在 MainActivity 中单击按钮打开。 “root”PreferenceScreen 中的所有选项都可以顺利运行,但我无法打开任何“子”PreferenceScreen。

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

  • 不应该 onPreferenceStartScreenonNavigateToScreen 之后立即调用.
    我究竟做错了什么?

    谢谢你的帮助!

    最佳答案

    您需要覆盖 PreferenceFragment方法getCallbackFragment , 像这样

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

    关于android - 在 Android 上的 PreferenceFragmentCompat 中永远不会调用 onPreferenceStartScreen(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61705111/

    相关文章:

    android - 为什么我的 Android PreferenceFragment 中的首选项是缩进的?

    java - 如何在我刚刚在 Android 中拍摄的图像上放置水印图像?

    android - WifiP2pManager 空

    android - NestedScrollView中的ConstraintLayout(带有RecyclerView)

    cordova - AndroidX 过渡和 Cordova,有哪些风险/好处?

    Android Test Orchestrator 不适用于 Android X

    android - 水平菜单浏览器兼容性

    flutter - 如何在 CameraX 中绑定(bind)预览和纹理

    java - android 支持 v14 PreferenceFragment 崩溃

    android - PreferenceFragment 崩溃,空对象引用