2014-04-05 2 views
1

Пожалуйста, помогите мне, я ударяю кирпичную стену в течение последних двух дней и не могу понять это.Android: ошибка раздувания класса PreferenceScreen

У меня есть простой PreferenceFragment и вы хотите раздуть его из Activity.

Вот Рез/XML/preferences.xml:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
    android:key="preferences"> 
<PreferenceCategory 
     android:title="@string/notification_basic" 
     android:key="notification"> 
    <CheckBoxPreference 
      android:key="enable_notification" 
      android:summary="@string/enable_notification" 
      android:title="@string/notification_title" 
      android:defaultValue="false"> 
    </CheckBoxPreference> 
    <CheckBoxPreference 
      android:key="enable" 
      android:summary="@string/enable_instant_notification" 
      android:title="@string/notify_me_instantly" 
      android:dependency="enable_notification" 
      android:defaultValue="false"> 
    </CheckBoxPreference> 
</PreferenceCategory> 
<PreferenceCategory 
     android:title="@string/sign_up_notify_me_where_section" 
     android:key="locations"> 
    <MultiSelectListPreference 
      android:dialogTitle="@string/sign_up_notify_me_where_title" 
      android:key="location" 
      android:summary="@string/sign_up_notify_me_where" 
      android:title="@string/sign_up_notify_me_where_title" 
      android:entries="@array/locations" 
      android:entryValues="@array/locations_values" 
      android:defaultValue="@array/empty_array" 
      android:dependency="enable_notification" 
      /> 
</PreferenceCategory> 
<PreferenceCategory 
     android:title="@string/sign_up_notify_me_type_section" 
     android:key="types"> 
    <MultiSelectListPreference 
      android:dialogTitle="@string/sign_up_notify_me_type_title" 
      android:key="type" 
      android:summary="@string/sign_up_notify_me_type" 
      android:title="@string/sign_up_notify_me_type_title" 
      android:entries="@array/types" 
      android:entryValues="@array/types_values" 
      android:defaultValue="@array/empty_array" 
      android:dependency="enable_notification" 
      /> 
</PreferenceCategory> 
<PreferenceCategory 
     android:title="@string/sign_up_notify_me_who_section" 
     android:key="units"> 
    <MultiSelectListPreference 
      android:dialogTitle="@string/sign_up_notify_me_who_title" 
      android:key="units" 
      android:summary="@string/sign_up_notify_me_who" 
      android:title="@string/sign_up_notify_me_who_title" 
      android:entries="@array/units" 
      android:entryValues="@array/units_values" 
      android:defaultValue="@array/empty_array" 
      android:dependency="enable_notification" 
      /> 
    </PreferenceCategory> 
</PreferenceScreen> 

Деятельность:

public class HomeActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.add(R.id.fragment_container, new SignUpPreferenceFragment()); 
    fragmentTransaction.commit(); 
    } 
} 

Компоновка деятельности:

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@+id/home_layout"> 
<FrameLayout android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:id="@+id/fragment_container" 
     /> 
</RelativeLayout> 

И, наконец, StackTrace:

04-05 20:11:07.641: ERROR/AndroidRuntime(5731): FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity  ComponentInfo{com.soid.client.activities/com.soid.client.activities.HomeActivity}:  android.view.InflateException: Binary XML file line #1: Error inflating class  PreferenceScreen 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2355) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391) 
    at android.app.ActivityThread.access$600(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1335) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:155) 
    at android.app.ActivityThread.main(ActivityThread.java:5520) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.view.InflateException: Binary XML file line #1: Error inflating  class PreferenceScreen 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:698) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:466) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
    at  com.soid.client.activities.SignUpPreferenceFragment.onCreateView(SignUpPreferenceFragment.ja va:18) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:831) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1037) 
    at android.app.BackStackRecord.run(BackStackRecord.java:635) 
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1399) 
    at android.app.Activity.performStart(Activity.java:5075) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2328) 
    ... 11 more 
    Caused by: java.lang.ClassNotFoundException: android.view.PreferenceScreen 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:552) 
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:643) 
    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66) 
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685) 
    ... 20 more 

Почему он ищет PreferenceScreen в android.view? Я полностью потерян, просьбы помогают мне.

Edit:

Я забыл вставить фактическое PreferenceFragment:

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    return inflater.inflate(R.xml.preferences, container, false); 

Спасибо!

+0

можно увидеть, что у вас есть в 'onCreate' в вашем классе' SignUpPreferenceFragment'? – singularhum

+0

Кажется, что эта http://stackoverflow.com/questions/13593141/how-do-i-add-preference-screen-to-viewpager та же проблема. – eleven

+0

Прошу прощения, я забыл вставить этот фрагмент кода. Я редактировал начальный пост сейчас. @singularhum – tarja

ответ

11

Вы должны удалить функцию onCreateView в вашем SignUpPreferenceFragment, потому что вы не можете надуть настройки, используя Inflater ,

Вот почему вы получаете сообщение об ошибке, которое вызывает раздувание PreferenceScreen, потому что оно не понимает этот тег/класс в xml.

Надувание preferences.xml сделано addPreferencesFromResource в onCreate.

Reference

+0

Большое вам спасибо! Глядя на то, что 'addPreferencesFromResource' действительно подтверждает ваше объяснение. Я новичок в концепции целого фрагмента, и, думаю, я с нетерпением ходил по учебникам. – tarja

+1

Устаревший запуск в API 11 вместе с addPreferencesFromIntent –

1

Вы должны иметь класс, где вы раздувать preference.xml так:

public static class SignUpPreferenceFragment extends PreferenceFragment { 

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

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

}

-1

Добавить предпочтения тему в свой styles.xml

<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>

Смежные вопросы