У меня есть PreferenceActivity с пользовательским макетом, чтобы держать статический заголовок поверх всех элементов.Я следовал этой теме, чтобы настроить это:
Добавление заголовка к 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 Не найдено представление для id дляфрагмент
Однако, если я только что закомментировал пользовательский макет, код работает, и фрагмент отображается правильно.Другими словами, это работает:
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);
}
Я полагаю, что менеджер фрагментов не может найти идентификатор, потому что представление списка теперь вложено в относительное расположение.Тем не менее, я понятия не имею, как это исправить.
Вот фрагмент фрагмента, но я не думаю, что это проблема:
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...
Любая помощь очень ценится.
спасибо.