使用 support.v7.preference 时未打开首选项子屏幕 [英] Preference sub-screen not opening when using support.v7.preference
问题描述
我正在尝试使用 AppCompatActivity 和 support.v7.preference 来实现带有子屏幕的首选项
I am trying to implement preferences with sub-screens using AppCompatActivity and support.v7.preference
根据文档,另一个 PreferenceScreen 中的每个 PreferenceScreen 都用作子屏幕,框架将在单击时处理显示它.http://developer.android.com/guide/topics/ui/settings.html#Subscreens
According to the docs, every PreferenceScreen within another PreferenceScreen functions as a sub-screen, and the framework will handle displaying it when clicked. http://developer.android.com/guide/topics/ui/settings.html#Subscreens
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- opens a subscreen of settings -->
<PreferenceScreen
android:key="button_voicemail_category_key"
android:title="@string/voicemail"
android:persistent="false">
<ListPreference
android:key="button_voicemail_provider_key"
android:title="@string/voicemail_provider" ... />
<!-- opens another nested subscreen -->
<PreferenceScreen
android:key="button_voicemail_setting_key"
android:title="@string/voicemail_settings"
android:persistent="false">
...
</PreferenceScreen>
<RingtonePreference
android:key="button_voicemail_ringtone_key"
android:title="@string/voicemail_ringtone_title"
android:ringtoneType="notification" ... />
...
</PreferenceScreen>
...
</PreferenceScreen>
使用本机 Activity、PreferenceFragment 可以正常工作...但使用 AppCompatActivity 和 PreferenceFragmentCompat,单击 Preference 元素只会突出显示它,但不会打开子屏幕.
This works fine using native Activity, PreferenceFragment... but using AppCompatActivity and PreferenceFragmentCompat, clicking the Preference element just highlights it, but doesn't open the sub-screen.
我在阅读文档和代码时找不到任何内容......我需要实现任何额外的回调吗?
I couldn't find anything on this reading the docs and the code... do I need to implement any additional callbacks?
只是为了完整性......
这有效并打开子屏幕:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new DemoPreferenceFragment())
.commit();
}
}
static public class DemoPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
}
这不起作用/打开子屏幕:
This doesn't work/open the sub-screen:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, new DemoPreferenceFragment())
.commit();
}
}
static public class DemoPreferenceFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.preferences);
}
}
}
<小时>
25/01/2016
在使用 support.v7.preference 几天后,我在这里总结了我的发现,希望它可以帮助其他人:如何使用 support.v7.preferenceAppCompat 和潜在缺点
After fiddling with support.v7.preference for a few days, I've summed up my findings here, hoping it may help others: HowTo use support.v7.preference with AppCompat and potential drawbacks
推荐答案
看起来像是 PreferenceFragmentCompat 中的错误或文档不足.它具有 onNavigateToScreen 方法,当您单击 PreferenceScreen 项时会调用该方法.
It looks like a bug in PreferenceFragmentCompat or insufficiency of docs. It has method onNavigateToScreen which is called when you click on PreferenceScreen item.
但是方法 getCallbackFragment() 默认返回 null,因此您需要在片段中覆盖它以返回它.您还需要实现 PreferenceFragmentCompat.OnPreferenceStartScreenCallback.
But method getCallbackFragment() returns null by default, so you need override it in your fragment to return this. Also you need to implement PreferenceFragmentCompat.OnPreferenceStartScreenCallback.
public class SettingsFragment extends PreferenceFragmentCompat implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
public static SettingsFragment newInstance() {
return new SettingsFragment();
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.news_settings);
}
@Override
public Fragment getCallbackFragment() {
return this;
}
@Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat, PreferenceScreen preferenceScreen) {
preferenceFragmentCompat.setPreferenceScreen(preferenceScreen);
return true;
}
}
但是当您无法回到初始 PreferenceScreen 时,它会导致另一个问题,
But it leads to another problem when you can't get back to your initial PreferenceScreen,
另一种方法是替换这里描述的片段 如何在 PreferenceFragmentCompat 中从 Preferences 子屏幕返回到主屏幕?
Another way is to replace fragment which is described here How to move back from Preferences subscreen to main screen in PreferenceFragmentCompat?
这篇关于使用 support.v7.preference 时未打开首选项子屏幕的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!