2017-11-17 5 views
1

내 애플 리케이션 설정에 대한 v7 지원 라이브러리의 PreferenceFragment를 사용하려고합니다. 나는 안드로이드 4.2.2에서 실행하려고하면 항상 다음과 같은 예외가 반환프래그먼트를 인스턴스화 할 수 없습니다. android.support.v14.preference.PreferenceFragment

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) { 

    } 
} 

답변

2

당신은 추상 클래스는 인스턴스화 할 수 없기 때문에 abstract 키워드를 제거하므로 사용할 필요가

public /*abstract*/ class AppCompatPreferenceActivity extends PreferenceActivity { 

추가 정보를 원하시면 Abstract Methods and Classes

+0

@Pavneet_Singh, 고맙습니다. – Jean

+0

@Jean이 당신과 함께 할 수도 있습니다 –

+0

ARCHOS 태블릿에서 동일한 오류가 발생했습니다. 4.2.2 – Jean

관련 문제