简体   繁体   中英

Inflation of Custom Preference failed

I wanted to make my own custom preference. But when I start the activity with the PreferenceFragment that contains the custom preference it fails with the following error:

01-13 07:11:26.117 14403-14403/com.laudien.p1xelfehler.batterywarner_pro E/AndroidRuntime: FATAL EXCEPTION: main Process: com.laudien.p1xelfehler.batterywarner_pro, PID: 14403 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.laudien.p1xelfehler.batterywarner_pro/com.laudien.p1xelfehler.batterywarner.Activities.SettingsActivity.SettingsActivity}: android.view.InflateException: Binary XML file line #42: Error inflating class com.laudien.p1xelfehler.batterywarner.Activities.SettingsActivity.SliderPreference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.M ethod.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) Caused by: android.view.InflateException: Binary XML file line #42: Error inflating class com.laudien.p1xelfehler.batterywarner.Activities.SettingsActivity.SliderPreference at android.preference.GenericInflater.createItem(GenericInflater.java:388) at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:432) at android.preference.GenericInflater.rInflate(GenericInflater.java:483) at android.preference.GenericInflater.rInflate(GenericInflater.java:495) at android.preference.GenericInflater.inflate(GenericInflater.java:327) at android.preference.GenericInflater.inflate(GenericInflater.java:264) at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:280) at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:326) at com.laudien.p1xel fehler.batterywarner.Activities.SettingsActivity.NewSettingsFragment.onCreate(NewSettingsFragment.java:14) at android.app.Fragment.performCreate(Fragment.java:2335) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:949) at android.app.BackStackRecord.setLastIn(BackStackRecord.java:857) at android.app.BackStackRecord.calculateFragments(BackStackRecord.java:897) at android.app.BackStackRecord.run(BackStackRecord.java:727) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578) at android.app.FragmentController.execPendingActions(FragmentController.java:371) at android.app.Activity.performStart(Activity.java:6680) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.jav a:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) Caused by: java.lang.NoSuchMethodException: [class android.content.Context, interface android.util.AttributeSet] at java.lang.Class.getConstructor0(Class.java:2204) at java.lang.Class.getConstructor(Class.java:1683) at android.preference.GenericInflater.createItem(GenericInflater.java:378) at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:432) at android.preference.GenericInflater.rInflate(GenericInflater.java:483) at android.preference.GenericInflater.rInflate(GenericInflater.java:495) at android.preference.GenericInflater.inflate(GenericInflater.java:327) at android.preference.GenericInflater.inflate(GenericInflater.java:264) at android.prefere nce.PreferenceManager.inflateFromResource(PreferenceManager.java:280) at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:326) at com.laudien.p1xelfehler.batterywarner.Activities.SettingsActivity.NewSettingsFragment.onCreate(NewSettingsFragment.java:14) at android.app.Fragment.performCreate(Fragment.java:2335) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:949) at android.app.BackStackRecord.setLastIn(BackStackRecord.java:857) at android.app.BackStackRecord.calculateFragments(BackStackRecord.java:897) at android.app.BackStackRecord.run(BackStackRecord.java:727) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578) at android.app.FragmentController.execPendingActions(FragmentController.java:371) at android.app.Activity.performStart(Activity.java:6680) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609) at android.app.ActivityThread.handleLaunchActivity(ActivityTh read.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

This is my SliderPreference.java:

public class SliderPreference extends Preference {
@Override
protected View onCreateView(ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    return inflater.inflate(R.layout.preference_slider, parent, false);
}

public SliderPreference(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
protected void onClick() {
    super.onClick();
}

}

This is the preference_slider.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
    android:id="@+id/textView_lowBattery"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Title"
    android:textSize="18sp" />

<CheckBox
    android:id="@+id/checkBox_lowBattery"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/enabled" />

<SeekBar
    android:id="@+id/seekBar_lowBattery"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

This is the NewSettingsFragment.java:

public class NewSettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
    addPreferencesFromResource(R.xml.preferences);
}

}

I added the preference in the preference.xml file just like that:

<com.laudien.p1xelfehler.batterywarner.Activities.SettingsActivity.SliderPreference />

Thank you for your help! :)

All right guys, i found the solution for myself.

You just have to use ALL constructors in the custom preference class. Like this:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public SliderPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}

public SliderPreference(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

public SliderPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public SliderPreference(Context context) {
    super(context);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM