如何导航到嵌套的Preferencescreen

时间:2011-03-06 20:08:27

标签: android

在我的应用程序中,我嵌套了PreferencesScreen的

<PreferencesScreen>
    <PreferencesScreen android:key="application">

    </PreferencesScreen>
</PreferencesScreen>

现在我要解雇Intent将我从currrent Activity直接带到应用程序首选项子屏幕。我怎么能这样做?

4 个答案:

答案 0 :(得分:6)

在我的应用程序中,我有类似的任务以编程方式显示第二级PreferencesScreen。我做了什么:

  1. preferences.xml我分配了一个要显示的PreferencesScreen的密钥(如问题所示)。

  2. 要显示PreferencesScreen我写道:

    final Intent preferencesActivity = new Intent(getBaseContext(), MyPreferencesActivity.class);
    preferencesActivity.putExtra("PREFERENCE_SCREEN_KEY", "key_of_preference_screen_to_show");
    startActivity(preferencesActivity);
    
  3. 然后在方法onCreate的PreferenceActivity类中添加了以下代码:

    final Intent intent = getIntent();
    final String startScreen = intent.getStringExtra("PREFERENCE_SCREEN_KEY");
    if (startScreen != null) {
        getIntent().removeExtra("PREFERENCE_SCREEN_KEY");
        final Preference preference = findPreference(startScreen);
        final PreferenceScreen preferenceScreen = getPreferenceScreen();
        final ListAdapter listAdapter = preferenceScreen.getRootAdapter();
        final int itemsCount = listAdapter.getCount();
        int itemNumber;
        for (itemNumber = 0; itemNumber < itemsCount; ++itemNumber) {
            if (listAdapter.getItem(itemNumber).equals(preference)) {
                preferenceScreen.onItemClick(null, null, itemNumber, 0);
                break;
            }
        }
    }
    
  4. 一句话......不仅是第二级PreferencesScreen,而且整个首选项层次结构都是在这里加载的。因此,如果按Back按钮,则会显示第一个(父级)PreferencesScreen。就我而言,这正是我所需要的。不确定你的。

答案 1 :(得分:4)

这是一种通过直接抓住子屏幕来解决问题的方法:

public class MyChildPreferenceActivity extends PreferenceActivity {

    private String screenKey = "myChildScreenKey";

    @Override
    public PreferenceScreen getPreferenceScreen() {
        PreferenceScreen root = super.getPreferenceScreen();
        if (root != null) {
            PreferenceScreen match = findByKey(root, screenKey);
            if (match != null) {
                return match;
            } else {
                throw new RuntimeException("key " + screenKey + " not found");
            }
        } else {
            return null;
        }
    }

    private PreferenceScreen findByKey(PreferenceScreen parent, String key) {
        if (key.equals(parent.getKey())) {
            return parent;
        } else {
            for (int i = 0; i < parent.getPreferenceCount(); i++) {
                Preference child = parent.getPreference(i);
                if (child instanceof PreferenceScreen) {
                    PreferenceScreen match = findByKey((PreferenceScreen) child, key);
                    if (match != null) {
                        return match;
                    }
                }
            }
            return null;
        }
    }

    // ...

答案 2 :(得分:4)

我用这种方式解决了你完全相同的问题。

在您的偏好活动中:

@Override
protected void onResume() {
    super.onResume();       

    int startingPage = getIntent().getIntExtra(Constants.PREFS_STARTING_PAGE, 0);

    switch (startingPage) {
        case Constants.MY_PREF_SCREEN_1:
            setPreferenceScreen((PreferenceScreen)findPreference(getString(R.string.PREF_SCREEN_1)));
            break;
        case Constants.MY_PREF_SCREEN_2:
            setPreferenceScreen((PreferenceScreen)findPreference(getString(R.string.PREF_SCREEN_2)));
            break;
        default:
            // Nothing to do, but read the warning below.
    }
}

然后您可以使用以下内容打开内部首选项屏幕:

    Intent prefIntent = new Intent(ctx, MyPreferenceActivity.class);
    prefIntent.putExtra(Constants.PREFS_STARTING_PAGE, Constants.MY_PREF_SCREEN_1);
    startActivity(prefIntent);

请注意,只要活动实例不同,此功能就会起作用:主要首选项屏幕的一个实例和内部屏幕的另一个实例。这样,当您在没有“启动”参数的情况下启动活动时,您始终会进入默认的开关情况,并且永远不需要设置主要首选项屏幕。这里的问题是,如果你首先运行以内部pref屏幕开始的活动,然后启动SAME活动(例如,使用标志singleInstance)请求一般(根)pref屏幕,则无法调用findPreference ()从子优先选择屏幕内找到根首选项屏幕。

嗯,希望没有太多混淆; - )

答案 3 :(得分:3)

我使用的方法是将嵌套的PreferenceScreen放入单独的XML文件中,并在其他PreferenceActivity中使用它。在这种情况下,您将能够使用Preference.setIntent()从偏好设置导航到此屏幕,并以通常的方式从另一个Activity开始此Activity