使用 support.v7.preference 时未打开首选项子屏幕 [英] Preference sub-screen not opening when using support.v7.preference

查看:30
本文介绍了使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆