PreferenceFragment:找不到片段ID

时间:2019-02-26 22:03:44

标签: android-fragments sharedpreferences

我有一个带有自定义布局的PreferenceActivity,以在所有项目的顶部保留一个静态标头。我按照此线程进行了设置:

Adding a header to a PreferenceActivity

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ImageView
        android:id="@+id/myCustomImageView"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:src="@mipmap/ic_launcher" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/myCustomImageView" />

</RelativeLayout>

这是我的“活动”代码段:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // this makes a static header
    setContentView(R.layout.preferences_layout);

    // register as a listener
    PreferenceManager.getDefaultSharedPreferences(this)
            .registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onBuildHeaders(List<Header> target) {
    loadHeadersFromResource(R.xml.preference_headers, target);
}

但是,当我点击一个项目时,应该生成一个片段,如我的xml所指定的:

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

<header
    android:fragment="ui.UserPreferences"
    android:summary="@string/preferences_activity_user_settings_summary"
    android:title="@string/preferences_activity_user_settings_title" />

   more items....     

但是,不是。相反,它崩溃时说:

java.lang.IllegalArgumentException: No view found for id 0x1020463 (android:id/prefs) for fragment UserPreferences

我看了看下面的一堆线程,但是它们没有帮助。

Android PreferenceFragment No view found for id for fragment

但是,如果我只是注释掉自定义布局,则代码可以正常工作,并且片段可以正确显示。换句话说,这有效:

public class Preferences extends PreferenceActivity
        implements SharedPreferences.OnSharedPreferenceChangeListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // this works: By commenting out the custom header, the exception goes away
        //setContentView(R.layout.preferences_layout);

        // register as a listener
        PreferenceManager.getDefaultSharedPreferences(this)
                .registerOnSharedPreferenceChangeListener(this);
    }

我相信片段管理器无法找到ID,因为listview现在嵌套在相对布局中。但是,我不知道如何解决此问题。

这里有一些项目片段,但是我不认为这是问题所在

public class UserPreferences extends PreferenceFragment implements
        Preference.OnPreferenceChangeListener,
        Preference.OnPreferenceClickListener,
        SharedPreferences.OnSharedPreferenceChangeListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /* Load the preferences from an XML resource */
        addPreferencesFromResource(R.xml.user_settings);

        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

    }

    more stuff...

非常感谢您的帮助。

谢谢。

0 个答案:

没有答案