Android: Error inflating class PreferenceScreen
Solution 1
You need to remove the onCreateView
function in your SignUpPreferenceFragment
because you cannot inflate the preferences using the inflater.
That is why you are getting the error stating that there is an error inflating PreferenceScreen
because it does not understand that tag/class in the xml.
The inflating of preferences.xml
is done by addPreferencesFromResource
in onCreate
.
Solution 2
You must have a class where you inflate the preference.xml like this:
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);
}
}
tarja
Updated on June 17, 2022Comments
-
tarja about 2 years
Please help me out here, I'm hitting brick wall for the last two days and can't figure it out.
I have a simple PreferenceFragment and would like to inflate it from an Activity.
Here is the res/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>
The Activity:
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(); } }
The layout of the activity:
<?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>
And finally the 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
Why does it search for the PreferenceScreen in android.view? I'm totally lost, pleas help me out.
Edit:
I forgot to paste the actual 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);
Thank you!
-
tarja about 10 yearsThank you so much! Looking at what
addPreferencesFromResource
actually does confirmed your explanation. I'm new to the whole fragment concept thing and i guess I was following the tutorials a bit to eagerly. -
Jordan Hochstetler about 10 yearsDeprecated starting in API 11 along with addPreferencesFromIntent