PreferenceFragment / PreferenceActivity падает - не могу понять, почему

Я хочу реализовать экран настроек. Таким образом, я следовал в основном примеру из документации для разработчиков. Когда я запускаю Activity, я вижу список заголовков с одним заголовком (эта часть, кажется, работает). Но как только я щелкаю этот заголовок, активность завершается с журналом ниже.

Я искал SO и Google, но не смог найти дополнительную информацию об этой ошибке.

Я попытался сократить preference_appearance_screen.xml до одного элемента CheckBoxPreference. По-прежнему та же ошибка в строке XML 18. Так что я предполагаю, что ошибка не найдена в этом файле.

Мой класс активности:

public class TrainerPreferenceActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

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

    public static class AppearancePrefFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preference_appearance_screen);
        }
    }
}

Файл preference_headers.xml:

<?xml version="1.0" encoding="utf-8"?>
<preference-headers
    xmlns:android="http://schemas.android.com/apk/res/android">
    <header android:fragment=".TrainerPreferenceActivity$AppearancePrefFragment"
           android:title="Appearance"
           android:summary="An example of some preferences." />
</preference-headers>

Файл preference_appearance_screen.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory 
        android:title="@string/pref_app_cat_theme">
    </PreferenceCategory>
    <PreferenceCategory 
        android:title="@string/pref_app_cat_background">
        <CheckBoxPreference 
            android:key="@string/pref_app_bg_iscustom_key" 
            android:title="@string/pref_app_bg_iscustom_title"
            android:summary="An example of some preferences."/>
        <CheckBoxPreference 
            android:key="@string/pref_app_bg_hascolor_key" 
            android:title="@string/pref_app_bg_hascolor_title"
            android:summary="An example of some preferences."/>  
        <CheckBoxPreference 
            android:key="@string/pref_app_bg_hasimage_key" 
            android:title="@string/pref_app_bg_hasimage_title"
            android:summary="An example of some preferences."/>
    </PreferenceCategory>
    <PreferenceCategory 
        android:title="@string/pref_app_cat_behavior">
        <CheckBoxPreference 
            android:key="@string/pref_app_orientationisenabled_key" 
            android:title="@string/pref_app_orientationisenabled_title"
            android:summary="An example of some preferences."/>        
        <CheckBoxPreference 
            android:key="@string/pref_app_gestureisenabled_key" 
            android:title="@string/pref_app_gestureisenabled_title"
            android:summary="An example of some preferences."/>
   </PreferenceCategory>
</PreferenceScreen>

LogCat:

04-30 17: 22: 01.215: E / AndroidRuntime (16775): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 04-30 17:22:01.215: E/AndroidRuntime(16775): java.lang.RuntimeException: строка двоичного XML-файла #18: Вы должен предоставить атрибут layout_width. 04-30 17:22:01.215: E/AndroidRuntime(16775): в android.content.res.TypedArray.getLayoutDimension(TypedArray.java:491) 04-30 17:22:01.215: E/AndroidRuntime(16775): в android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:5318) 04-30 17:22:01.215: E/AndroidRuntime(16775): в android.view.ViewGroup$LayoutParams.(ViewGroup.java:5271) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.AbsListView$LayoutParams.(AbsListView.java:5718) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.AbsListView.generateLayoutParams(AbsListView.java:5355) 04-30 17:22:01.215: E/AndroidRuntime(16775): в android.widget.AbsListView.generateLayoutParams(AbsListView.java:86) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.LayoutInflater.inflate(LayoutInflater.java:477) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.LayoutInflater.inflate (LayoutInflater. Java:396) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.preference.Preference.onCreate Просмотр (Preference.java:474) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.preference.Preference.getView(Preference.java:451) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.preference.PreferenceGroupAdapter.getView(PreferenceGroupAdapter.java:221) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.AbsListView.obtainView(AbsListView.java:2033) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.ListView.onMeasure(ListView.java:1127) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.View.measure(View.java:12723) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 04-30 17:22:01.215: E/AndroidRuntime(16775): в android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 04-30 17:22:01.215: E/AndroidRuntime(16775): в android.widget.LinearLayout.measureer LinearLayout.java:660) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.LinearLayout.on Мера (LinearLayout.java:553) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.View.measure(View.java:12723) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:4698) 04-30 17: 22: 01.215: E / AndroidRuntime (16775): на android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.View.measure(View.java:12723) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 04-30 17:22:01.215: E/AndroidRuntime(16775): atroid.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1369) 04-30 17:22: 01.215: E / AndroidRuntime (16775): на android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.View.measure(View.java:12723) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.LinearLayout.measureHorizontal(LinearLayout.java:999) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.LinearLayout.onMeasure(LinearLayout.java:555) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.View.measure(View.java:12723) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.LinearLayout.measureVertical(LinearLayout.java:812) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.View.measure(View.java:12723) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:4698) 04-30 17: 22: 01.215: E / AndroidRuntime (16775): в android.widget.FrameLayout.onMeasure (FrameLayout.java:293) 04-30 17:22: 01.215: E / AndroidRuntime (16775): на android.view.View.measure(View.java:12723) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.widget.LinearLayout.measureVertical(LinearLayout.java:812) 04-30 17:22:01.215: E/AndroidRuntime(16775): в android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.View.measure(View.java:12723) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.ViewGroup.measureChildWithMargins (ViewGroup. Java:4698) 04-30 17:22:01.215: E/AndroidRuntime(16775): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 04-30 17:22:01.215: E/AndroidRuntime(16775): в com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092) 04-30 17:22:01.215: E/AndroidRuntime(16775): в android.view.View.measure (Просмотреть.java:12723) 04-30 17:22:01.215: E/AndroidRuntime(16775): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.os.Handler.dispatchMessage(Handler.java:99) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.os.Looper.loop(Looper.java:137) 04-30 17:22:01.215: E/AndroidRuntime(16775): на android.app.ActivityThread.main(ActivityThread.java:4424) 04-30 17:22:01.215: E/AndroidRuntime(16775): на java.lang.reflect.Method.invokeNative(собственный метод) 04-30 17: 22: 01.215: E / AndroidRuntime (16775): в java.lang.reflect.Method.invoke(Method.java:511) 04-30 17:22:01.215: E/AndroidRuntime(16775): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 04-30 17:22:01.215: E/AndroidRuntime(16775): на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 04-30 17:22:01.215: E/AndroidRuntime(16775): в dalvik.system.NativeStart.main(собственный метод)

2 ответа

Решение

Хорошо, я настроил быстрый тестовый проект, но я не смог воспроизвести ошибку - она ​​отображается и отлично работает на моем Galaxy Nexus. На каком устройстве вы работаете, и пробовали ли вы другие эмуляторы?

Единственная, возможно, связанная с этим проблема, которую я мог найти, это проблема, связанная со стилем / темами, которая, кажется, появляется здесь и там. Вы сделали какие-либо настройки? Если это так, попробуйте запустить приведенный выше код как 'vanilla', насколько это возможно, чтобы увидеть, если это имеет значение.

Это связано с тем, что вы указали пользовательский стиль для своего приложения, который используется на экране настроек, и этот пользовательский стиль не наследует эти обязательные свойства. Чтобы сохранить ваш собственный стиль и избежать этой проблемы, убедитесь, что ваш собственный стиль имеет свойства layout_width и layout_height. В твоем случае:

    <style name="MyListSeperator" parent="android:Widget.Holo.Light.TextView">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        ...
    </style>

и тогда ты продолжаешь раскомментировать

    <item name="android:listSeparatorTextViewStyle">@style/MyListSeparator</item>
Другие вопросы по тегам