如何从PreferenceActivity调用特定的PreferenceFragment?

13

我有一个PreferenceActivity,其中包含多个片段:

R.xml.preferences:(为了更好的可读性而缩短):

<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    <header android:fragment="fragments.Fragment1" android:id="@+id/fragment1" [...] />
    <header android:fragment="fragments.Fragment2" android:id="@+id/fragment2" [...] />
    [...]
</preference-headers>

SettingsActivity

public class SettingsActivity extends PreferenceActivity {
    @Override
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.preferences, target);
    }
}

如果启动了SettingsActivity,这将显示一个带有fragments.Fragment1fragments.Fragment2等的列表条目。

但是现在我想传递一个Bundle,以便在启动活动时打开特定的PreferenceFragment:

因此,我将以下内容添加到SettingsActivity中:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null && savedInstanceState.getBoolean("shortcut")) {
        // directly jump to fragments.Fragment1
    }
}

我尝试通过getFragmentManager().findFragmentById(R.id.fragment1)加载片段,但返回null。即使我有正确的实例,我也不知道如何调用它。同时,调用loadHeadersFromResource(R.xml.preferences_fragment1, target);是无效的 - 这将抛出一个RuntimeException "XML document must start with tag; foundPreferenceScreen at Binary XML file"。我已经没有更多的想法了,而且在SO和Google上的搜索也没有返回任何相关的结果。

所以我的问题是:是否可以直接从Activity的onCreate方法中加载PreferenceFragment(例如fragments.Fragment1)?如果可以,怎么做?

3个回答

34
根据:http://developer.android.com/reference/android/preference/PreferenceActivity.html#EXTRA_SHOW_FRAGMENT

public static final String EXTRA_SHOW_FRAGMENT

自 API level 11 起添加。在启动此活动时,调用意图可以包含此额外字符串以指定应最初显示哪个片段。

常量值: ":android:show_fragment"

intent = new Intent( this, SettingsActivity.class );
intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, Fragment1.class.getName() );
intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true );

真的很酷,他们支持了这个。谢谢分享。这对我也很有效。 - lepert
它可以工作。我也试图通过putExtra将请求操作传递给该活动,但是Bundle savedInstanceState始终为空。请帮忙。 - sam

1

只需在PreferenceActivityPreferenceFragment中的onCreate中使用以下代码:

addPreferencesFromResource(R.xml.**YOUR PREFERENCE FRAGMENT XML**);

0

或者使用PreferenceActivity.switchToHeader

启动PreferenceActivity时,首先加载所有设置页面的标题/概述,然后再加载片段。完成片段后,您将返回概述。

MyPreferenceActivity:

@Override
public void onBuildHeaders(List<Header> headers) {

    loadHeadersFromResource(R.xml.preference_headers, headers);

    int headerId = getIntent() != null ? getIntent().getIntExtra("header", 0) : 0;
    if (headerId > 0) {
        getIntent().removeExtra("header");
        switchToHeader(findHeaderById(headerId));
    }
}

private Header findHeaderById(long id) {

    if (headers != null)
        for (Header header : headers)
            if (header.id == id) return header;

    return null;
}

这里展示了如何在你的MainActivity中调用PreferenceActivity和Fragment:
Intent intent = new Intent(context, MyPreferenceActivity.class);
intent.putExtra("header", R.id.header1);
intent.putExtra("key", "pref1");
startActivity(intent);

如果需要的话,您可以立即在PreferenceFragment1中打开相应的偏好设置:

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences_1);  

    String key = getActivity().getIntent() != null ? getActivity().getIntent().getStringExtra("key") : null;

    if (key != null) {
         getActivity().getIntent().removeExtra(key);
         openPreference(key);
    }
}

private void openPreference(String key) {

    PreferenceScreen preferenceScreen = getPreferenceScreen();
    ListAdapter listAdapter = preferenceScreen.getRootAdapter();

    for (int position = 0; position < listAdapter.getCount(); position++) {

        Preference preference = (Preference) listAdapter.getItem(position);

        if (preference.equals(findPreference(key))) {
            preferenceScreen.onItemClick(null, null, position, 0);
            break;
        }
    }
}

preference_headers.xml:

<?xml version="1.0" encoding="utf-8"?>

<preference-headers
    xmlns:android="http://schemas.android.com/apk/res/android">

    <header android:id="@+id/headers1"
        android:fragment="de.almisoft.PreferenceFragment1"
        android:title="Title1"
        android:summary="Summary1">
    </header>

    <header android:id="@+id/headers2"
        android:fragment="de.almisoft.PreferenceFragment2"
        android:title="Title2"
        android:summary="Summary2">
    </header>

</preference-headers>

preferences_1.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference
        android:key="pref1"
        android:title="title"/>

</PreferenceScreen>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接