繁体   English   中英

Android 中匿名类的 InstantiationException 问题

[英]InstantiationException issue with Anonymous Class in Android

A. 我想使用 AlertDialogBox Anonymous 类创建弹出窗口,如下所示

private void showPopupChangeCurrency(final CharSequence[] items, final String title){
    ...
        myAlert = new AlertDialogBox() { //This is anonymous class

        @Override
        protected void setButtonRight() {
        ...
        }
    ...
}

B. 问题:当改变方向或语言时,我遇到了InstantiationException FC 问题:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.loudlex/com.loudlex.setting.CloudSettings}: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.loudlex.setting.CloudSettings$5: make sure class name exists, is public, and has an empty constructor that is public
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3195)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3291)
    at android.app.ActivityThread.-wrap16(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1743)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7010)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:731)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:621)
Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.loudlex.setting.CloudSettings$5: make sure class name exists, is public, and has an empty constructor that is public
    at android.app.Fragment.instantiate(Fragment.java:642)
    at android.app.FragmentState.instantiate(Fragment.java:114)
    at android.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1873)
    at android.app.FragmentController.restoreAllState(FragmentController.java:122)
    at android.app.Activity.onCreate(Activity.java:1010)
    at com.loudlex.utility.ConfWindow.onCreate(ConfWindow.java:60)
    at com.loudlex.setting.CloudSettings.onCreate(CloudSettings.java:105)
    at android.app.Activity.performCreate(Activity.java:6786)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3148)

C. 问题:我想知道是否有任何解决方案可以很好地处理匿名类。

注意 我知道有一些方法可以解决这个问题,例如:通过使用公共静态嵌套类或与顶级类分开。 谢谢

你有三个解决方案:

  1. 在单独的类中移动CloudSettings
  2. 将内部类更改为public static

     public static class CloudSettings extends DialogFragment
  3. 调用myAlert.setRetainInstance(true);

    控制片段实例是否在 Activity 重新创建期间保留(例如来自配置更改)

    参考: http : //developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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