Странная ошибка с использованием onCreateView в PreferenceFragment при вызове addPreferencesFromResource из onCreate

Я пытаюсь добавить ImageView в фрагмент предпочтения, чтобы показать предварительный просмотр настройки цвета. Я обращаюсь к экземпляру изображения с помощью метода onCreateView, чтобы настроить цвет теста, и он будет отображаться. Однако он работает только в том случае, если я не вызываю addPreferencesFromResource в методе onCreate, что является проблемой, поскольку предпочтения должны быть добавлены. Также, если я оставлю вызов addPreferencesFromResource, но удалю весь метод onCreateView, программа запустится (albiet без обновляемого изображения).

Ошибка в обоих случаях: «Содержимое имеет представление с атрибутом id» android.R.id.list ', которое не является классом ListView "

Я попытался получить доступ к представлению изображения из onCreate, но к тому времени элементы макета завышены, и я не могу получить доступ к фактическому экземпляру, который отображается.

Ошибка LogCat:

04-11 00:42:43.619: E/AndroidRuntime(5362): FATAL EXCEPTION: main 04-11 00:42:43.619: E/AndroidRuntime(5362): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.signalwidget/com.example.android.signalwidget.SignalWidgetConfigure}: java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list' that is not a ListView class 

Здесь PreferenceActivity с встроенным фрагментом:

 public class SigConfigure extends PreferenceActivity { private static int prefs=R.xml.pref_widget_colors; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //getFragmentManager().beginTransaction().replace(android.R.id.content, new ColorsFragment()).commit(); } @Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.pref_headers, target); } public static class ColorsFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(SignalWidgetConfigure.prefs); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); //just testing to see if the imageview can be accessed. View v = inflater.inflate(R.layout.layout_pref_row, container, false); ImageView iv = (ImageView) v.findViewById(R.id.color_preview); iv.setBackgroundColor(Color.CYAN); return v; } }} 

Вот определение предпочтений в pref_widget_colors

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <Preference android:key="wifi_signal_color" android:title="WiFi Signal Color" > <intent android:action="android.intent.action.VIEW" android:targetClass="com.example.android.signalwidget.colorpicker.PickerActivity" android:targetPackage="com.example.android.signalwidget" /> </Preference> <Preference android:key="cell_signal_color" android:title="Cell Signal Color" > <intent android:action="android.intent.action.VIEW" android:targetClass="com.example.android.signalwidget.colorpicker.PickerActivity" android:targetPackage="com.example.android.signalwidget" /> </Preference> </PreferenceScreen> 

Вот макет, содержащий изображение в layout_pref_row.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/color_preview" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginTop="5dp" android:background="#aaa" /> </LinearLayout> 

Несмотря на ошибку, я не использую ListView или ListFragment нигде в моем проекте. Это почти похоже на ошибку Android. Любое предложение будет оценено по достоинству.

Solutions Collecting From Web of "Странная ошибка с использованием onCreateView в PreferenceFragment при вызове addPreferencesFromResource из onCreate"

Когда вы создаете пользовательский параметр для PreferenceActivity или PreferenceFragment, вы должны предоставить ListView с идентификатором android.R.id.list, куда идут настройки.

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/color_preview" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginTop="5dp" android:background="#aaaaaa" /> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="5dp" /> </LinearLayout> 

У меня тоже была эта проблема. Это связано с использованием обучающих программ для Android здесь: http://developer.android.com/guide/topics/ui/settings.html#Fragment

В основном, я обнаружил, что проблема связана с использованием файла preferences.xml:

 addPreferencesFromResource(R.xml.preferences); 

Как только я прокомментировал это, ошибка исчезла, и моя активность начала показываться, хотя и не была загружена предпочтениями. Я попытаюсь выследить это и проследить здесь.

Надеюсь, это помогло до сих пор! Исключенное исключение не очень полезно.

У меня была та же проблема, и решение заключалось в том, чтобы я импортировал нужную библиотеку фрагментов:

 import android.app.Fragment; 

(Не версия из библиотеки поддержки)