android.support.v4.app.Fragment$InstantiationException: Unable to instantiate&nbs


android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment benguo.simphone.payy.view.ContentFragment: make sure class name exists, is public, and has an empty constructor that is public  解決辦法

     根據報錯提示“make sure class name exists, is public, and has an empty constructor that is public”,若Fragement定義有帶參構造函數,則一定要定義public的默認的構造函數。即可解決此問題。如果硬要攜帶參數進去,可以通過Intent結合Bunble的方式攜帶進去。

寫一個靜態方法來實例化自己的Fragment。代碼如下:

public static final Fragment newInstance(String key){         Fragment fragment = new RealtimeSearchFragment();  

      Bundle bundle = new Bundle();  

        bundle.putString("key", key);  

        fragment.setArguments(bundle);  

       return fragment;  

    }  

在自己的Activity裏這樣獲取這個Fragment:
  1. Fragment realtimeSearchFragment = RealtimeSearchFragment.newInstance(realSearchKey);  

在自己的Fragment 的onCreateView方法裏獲取Activity傳過來的值:
  1. getArguments().getString("key"

  還有一種報錯如下貼的log信息,在“is public, and has an empty constructor that is public” 都滿足的情況下,編譯ENG版本運行沒有任何問題,但是編譯USER版本就會出現CRASH錯誤。原因在於USER版本編譯時會代碼混淆。

E/AndroidRuntime( 3253): FATAL EXCEPTION: main

E/AndroidRuntime( 3253): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.SubSettings}: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.android.settings.mcwill.McWiLLSettings: make sure class name exists, is public, and has an empty constructor that is public

E/AndroidRuntime( 3253):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1964)
E/AndroidRuntime( 3253):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1989)
E/AndroidRuntime( 3253):     at android.app.ActivityThread.access$600(ActivityThread.java:126)
E/AndroidRuntime( 3253):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1155)
E/AndroidRuntime( 3253):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 3253):     at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 3253):     at android.app.ActivityThread.main(ActivityThread.java:4482)
E/AndroidRuntime( 3253):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3253):     at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 3253):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
E/AndroidRuntime( 3253):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
E/AndroidRuntime( 3253):     at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 3253): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.android.settings.mcwill.McWiLLSettings: make sure class name exists, is public, and has an empty constructor that is public
E/AndroidRuntime( 3253):     at android.app.Fragment.instantiate(Fragment.java:581)
E/AndroidRuntime( 3253):     at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1120)
E/AndroidRuntime( 3253):     at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1136)
E/AndroidRuntime( 3253):     at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:532)
E/AndroidRuntime( 3253):     at com.android.settings.Settings.onCreate(Settings.java:99)
E/AndroidRuntime( 3253):     at android.app.Activity.performCreate(Activity.java:4465)
E/AndroidRuntime( 3253):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
E/AndroidRuntime( 3253):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928)
E/AndroidRuntime( 3253):     ... 11 more
E/AndroidRuntime( 3253): Caused by: java.lang.ClassNotFoundException: com.android.settings.mcwill.McWiLLSettings
E/AndroidRuntime( 3253):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
E/AndroidRuntime( 3253):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
E/AndroidRuntime( 3253):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
E/AndroidRuntime( 3253):     at android.app.Fragment.instantiate(Fragment.java:571)
E/AndroidRuntime( 3253):     ... 18 more
W/ActivityManager(  422):   Force finishing activity com.android.settings/.SubSettings
W/ActivityManager(  422):   Force finishing activity com.android.settings/.Settings

       解決辦法:

        在對應模塊的proguard.flags文件中引入該Fragment所在的類包即可。比如: -keep class com.android.settings.wifi.*Settings

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章