onPreferenceStartScreen() 从未在 Android 的 PreferenceFragmentCompat 中被调用
onPreferenceStartScreen() is never called in PreferenceFragmentCompat on Android
关于Whosebug的第一个问题,不一致之处还请见谅
我的 Android 应用实现了一个 PreferenceFragmentCompat 片段,该片段通过在 MainActivity 中单击按钮打开。 "root" PreferenceScreen 中的所有选项都可以正常工作,但我无法打开任何 "child" PreferenceScreens。
经过大量搜索,我发现需要在我的片段中实现 onPreferenceStartScreen 回调,并且成功了!但是现在,我对应用程序做了很多更改,一定是搞砸了,但我不知道是什么。
就这样吧!
除其他外,我在我的应用级别实现了这 2 个库 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首选项片段(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
。
我做错了什么?
感谢您的帮助!
您需要重写 PreferenceFragment
方法 getCallbackFragment
,像这样
@Override
public Fragment getCallbackFragment() {
return this;
}
关于Whosebug的第一个问题,不一致之处还请见谅
我的 Android 应用实现了一个 PreferenceFragmentCompat 片段,该片段通过在 MainActivity 中单击按钮打开。 "root" PreferenceScreen 中的所有选项都可以正常工作,但我无法打开任何 "child" PreferenceScreens。
经过大量搜索,我发现需要在我的片段中实现 onPreferenceStartScreen 回调,并且成功了!但是现在,我对应用程序做了很多更改,一定是搞砸了,但我不知道是什么。
就这样吧!
除其他外,我在我的应用级别实现了这 2 个库 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首选项片段(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
。
我做错了什么?
感谢您的帮助!
您需要重写 PreferenceFragment
方法 getCallbackFragment
,像这样
@Override
public Fragment getCallbackFragment() {
return this;
}