InstantiationException on Orientation Change, wenn DialogFragment oben steht

Ich habe ein DialogFragment definiert als innere Klasse in meiner Fragment . Bei Orientierungsänderung wird auch die folgende Ausnahme eingefügt:

  Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment my.package.fragments.ImportFragment$FailedImportDialog: make sure class name exists, is public, and has an empty constructor that is public at android.app.Fragment.instantiate(Fragment.java:585) at android.app.FragmentState.instantiate(Fragment.java:96) at android.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1682) at android.app.Activity.onCreate(Activity.java:861) at my.package.activities.ImportActivity.onCreate(ImportActivity.java:8) at android.app.Activity.performCreate(Activity.java:4465) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) ... 12 more Caused by: java.lang.InstantiationException: can't instantiate class my.package.fragments.ImportFragment$FailedImportDialog; no empty constructor at java.lang.Class.newInstanceImpl(Native Method) at java.lang.Class.newInstance(Class.java:1319) at android.app.Fragment.instantiate(Fragment.java:574) 

Aber ich habe öffentlichen Konstruktor:

  • Beende die untere Leiste in CoordinatorLayout
  • Rückgabe eines Input-Streams aus Paket-Datei-Deskriptor mit Androids DownloadManager
  • AppCompatSpinner-Einträge öffnen nicht TimePickerDialog bei der Auswahl zum zweiten Mal. Bitte beachten Sie die Details
  • Wie bekomme ich App wie Flipboard?
  • Wie teste ich den android.max_aspect für Galaxy S8
  • Hat ImageView.setImageBitmap () die zuvor eingestellte Bitmap wiederverwendet?
  •  class FailedImportDialog extends DialogFragment { private EditText edtPassword; private Button button; public FailedImportDialog() { // Here it is! } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.another_password_dialog, container, false); edtPassword = (EditText) v.findViewById(R.id.another_password_dialog_et_password); getDialog().setTitle(R.string.failed_to_decrypt); Button button = (Button) v.findViewById(R.id.another_password_dialog_btn_ok); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { }); return v; } } 

    Hier ist xml:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:padding="10dp"> <TextView android:id="@+id/another_password_dialog_tv_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/what_password_did_you_use"> </TextView> <EditText android:id="@+id/another_password_dialog_et_password" android:layout_height="wrap_content" android:layout_width="match_parent" android:inputType="textPassword"> <requestFocus> </requestFocus> </EditText> <Button android:id="@+id/another_password_dialog_btn_ok" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="OK"> </Button> </LinearLayout> 

    Wissen sie, warum diese Ausnahme passiert? Vielen Dank!

    UPDATE: Wenn ich eine Klasse in eine separate Datei verschiebe, gibt es keine solche Ausnahme, alles geht reibungslos. Also die Frage ist – warum diese Ausnahme passiert, wenn DialogFragment eine innere Klasse ist?

  • Wie kann man die java.lang.VerifyError: org / apache / poi / xssf / usermodel / XSSFWorkbook lösen?
  • Wie benutzt man Hardware beschleunigte Video-Decodierung auf Android?
  • Data Binding - Wie schreibe ich mehrzeilige Deklarationen?
  • Nach der Einrichtung von android-support-v7-appcompat R.java fehlt
  • PhoneGap - Erkennung von Gerätetypen im Telefongap
  • Erstellen und Positionieren einer Floating Action Button
  • 3 Solutions collect form web for “InstantiationException on Orientation Change, wenn DialogFragment oben steht”

    Versuchen, die innere Klasse statisch zu machen:

     public static class FailedImportDialog extends DialogFragment 

    Ich werde in einer Weile mehr Erklärung dazu geben. In der Zwischenzeit versuchen Sie dies und lassen Sie mich wissen, ob es funktioniert.

    Wenn Sie setRetainInstance (true) aufrufen, wird der FragmentManager die eigentliche Fragment-Instanz speichern. Anstatt das Fragment zu zerstören und neu zu erstellen, wird es einfach das gleiche mit der neuen Aktivität überschreiten.

    Definiere deine innere Klasse so:

     public class FailedImportDialog extends DialogFragment { .... } 

    Mit der öffentlichen Notation.

    Denn das ist es, was dein LogCat sagt:

     Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment my.package.fragments.ImportFragment$FailedImportDialog: make sure class name exists is public, and has an empty constructor that is public 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.