android - 无法实例化 fragment android.support.v14.preference.PreferenceFragment

标签 android preferenceactivity preferencefragment

我正在尝试使用 v7 支持库中的 PreferenceFragment 来设置我的应用程序。当我尝试在 android 4.2.2 中运行它时,它总是返回以下异常:

E/AndroidRuntime: FATAL EXCEPTION: main
                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{fr.mobiho.navapp/fr.mobiho.navapp.settings.activity.PrefsActivity}: android.app.Fragment$InstantiationException: Unable to instantiate fragment android.support.v14.preference.PreferenceFragment: make sure class name exists, is public, and has an empty constructor that is public
                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
                                                                  at android.app.ActivityThread.access$600(ActivityThread.java:141)
                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
                                                                  at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                  at android.os.Looper.loop(Looper.java:137)
                                                                  at android.app.ActivityThread.main(ActivityThread.java:5041)
                                                                  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:793)
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                                                                  at dalvik.system.NativeStart.main(Native Method)
                                                               Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment android.support.v14.preference.PreferenceFragment: make sure class name exists, is public, and has an empty constructor that is public
                                                                  at android.app.Fragment.instantiate(Fragment.java:596)
                                                                  at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1138)
                                                                  at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1154)
                                                                  at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:560)
                                                                  at fr.mobiho.navapp.activity.AppCompatPreferenceActivity.onCreate(AppCompatPreferenceActivity.java:35)
                                                                  at fr.mobiho.navapp.settings.activity.ThemableSettingsActivity.onCreate(ThemableSettingsActivity.java:39)
                                                                  at fr.mobiho.navapp.settings.activity.PrefsActivity.onCreate(PrefsActivity.java:53)
                                                                  at android.app.Activity.performCreate(Activity.java:5104)
                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
                                                                  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
                                                                  at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                  at android.os.Looper.loop(Looper.java:137) 
                                                                  at android.app.ActivityThread.main(ActivityThread.java:5041) 
                                                                  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:793) 
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
                                                                  at dalvik.system.NativeStart.main(Native Method) 
                                                               Caused by: java.lang.InstantiationException: can't instantiate class android.support.v14.preference.PreferenceFragment
                                                                  at java.lang.Class.newInstanceImpl(Native Method)
                                                                  at java.lang.Class.newInstance(Class.java:1319)
                                                                  at android.app.Fragment.instantiate(Fragment.java:585)
                                                                  at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1138) 
                                                                  at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1154) 
                                                                  at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:560) 
                                                                  at fr.mobiho.navapp.activity.AppCompatPreferenceActivity.onCreate(AppCompatPreferenceActivity.java:35) 
                                                                  at fr.mobiho.navapp.settings.activity.ThemableSettingsActivity.onCreate(ThemableSettingsActivity.java:39) 
                                                                  at fr.mobiho.navapp.settings.activity.PrefsActivity.onCreate(PrefsActivity.java:53) 
                                                                  at android.app.Activity.performCreate(Activity.java:5104) 
                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
                                                                  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
                                                                  at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                  at android.os.Looper.loop(Looper.java:137) 
                                                                  at android.app.ActivityThread.main(ActivityThread.java:5041) 
                                                                  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:793) 
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
                                                                  at dalvik.system.NativeStart.main(Native Method) 

但在更高版本中,它可以正常工作,如 5.0、5.1、6.0。

这是 AppCompatPreferenceActivity 类

public abstract class AppCompatPreferenceActivity extends PreferenceActivity {

    private AppCompatDelegate mDelegate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        overridePendingTransition(R.anim.slide_in_from_right, R.anim.fade_out_scale);
        getDelegate().installViewFactory();
        getDelegate().onCreate(savedInstanceState);
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        getDelegate().onPostCreate(savedInstanceState);
    }

    protected final ActionBar getSupportActionBar() {
        return getDelegate().getSupportActionBar();
    }

    protected final void setSupportActionBar(@Nullable Toolbar toolbar) {
        getDelegate().setSupportActionBar(toolbar);
    }

    @NonNull
    @Override
    public MenuInflater getMenuInflater() {
        return getDelegate().getMenuInflater();
    }

    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        getDelegate().setContentView(layoutResID);
    }

    @Override
    public void setContentView(View view) {
        getDelegate().setContentView(view);
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        getDelegate().setContentView(view, params);
    }

    @Override
    public void addContentView(View view, ViewGroup.LayoutParams params) {
        getDelegate().addContentView(view, params);
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        getDelegate().onPostResume();
    }

    @Override
    protected void onTitleChanged(CharSequence title, int color) {
        super.onTitleChanged(title, color);
        getDelegate().setTitle(title);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getDelegate().onConfigurationChanged(newConfig);
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (isFinishing()) {
            overridePendingTransition(R.anim.fade_in_scale, R.anim.slide_out_to_right);
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        getDelegate().onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getDelegate().onDestroy();
    }

    public void invalidateOptionsMenu() {
        getDelegate().invalidateOptionsMenu();
    }

    private AppCompatDelegate getDelegate() {
        if (mDelegate == null) {
            mDelegate = AppCompatDelegate.create(this, null);
        }
        return mDelegate;
    }
}

这是 MyCustomPreferenceFragment

public class MyCustomPreferenceFragment extends PreferenceFragment {

    @Inject
    PreferenceManager mPreferenceManager;

    public MyCustomPreferenceFragment() {

    }

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

    }

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {

    }
}

最佳答案

你必须删除abstract关键字,因为抽象类不能被实例化,所以使用

public /*abstract*/ class AppCompatPreferenceActivity extends PreferenceActivity { 

进一步阅读 Abstract Methods and Classes

关于android - 无法实例化 fragment android.support.v14.preference.PreferenceFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47353634/

相关文章:

android - 边距属性在自定义 DialogFragment 中不起作用

java - Android Studio 游戏在新设备上运行速度较慢,在旧设备上运行速度较快

Android preference-headers 额外参数

java - PreferenceFragment 与 AppCompatActivity Android

android - 在 PreferenceFragment 中去掉上面的额外填充

android - @style/PreferenceThemeOverlay 的 PreferenceFragmentCompat 填充问题

java - 构建配置语言和 Android Studio 中的语言有什么区别?

java - Android - ViewPager 不显示 fragment

java - Android:无法找到明确的 Activity 类...从 PreferenceActivity 开始 Activity

android - 调用 onContentChanged 时 CheckboxPreference 状态没有改变