2015-11-17 2 views
2

A. Я хочу создать Popup с помощью AlertDialogBox Анонимного класса, как показано ниже:InstantiationException проблема с анонимным классом в Android

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

«убедитесь, что имя класса существует, является общедоступным, и имеет ** пустой конструктор, который является публичным ** ". Есть ли пустой конструктор вашего пользовательского класса? – Sufian

+0

Я думаю, что ответ НЕТ, потому что CloudSettings $ 5 является анонимным классом, поэтому у него нет явного конструктора объявления, и я думаю, что компилятор также не автоматически добавляет пустой конструктор для анонимного класса. – NguyenDat

+1

Я думаю, вы должны поделиться этим кодом. Мы как сейчас делаем угадывание. :) – Sufian

ответ

1

У вас есть три решения:

  1. Move CloudSettings в отдельный класс
  2. Измените свой внутренний класс public static

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

    управления сохраняется ли экземпляр фрагмента через операцию повторного создания (например, от изменения конфигурации)

    Ссылка: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

+0

Thanks , похоже, что с анонимным классом нет никакого способа. – NguyenDat

Смежные вопросы