Fragment - InstantiationException: keine leeren Konstruktor -> Google Maps v2?
Bekomme ich diese Fehlermeldung, wenn ich eine geschlossene App erneut über den App-Wechsel-Taste:
Caused by: java.lang.InstantiationException: can't instantiate class com.*.FragmentContact$1; no empty constructor
Habe ich einige Tipps um den Inneren-Klassen und der statischen etc. Aber das FragmentContact ist ein öffentlichen Klasse in einer *.java-Datei und einen öffentlichen leeren Konstruktor.
Ich bin mit der Google Maps Api v2 in dieses Projekt und machen Sie einen trick irgendwo aus dem internet auf meine setup-MapView. Schau mal hier:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_contact, null);
try {
MapsInitializer.initialize(this.getActivity().getApplicationContext());
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}
fragment = new SupportMapFragment() {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mMap = fragment.getMap();
if (mMap != null) {
setupMap();
}
}
};
getFragmentManager().beginTransaction().replace(R.id.fragment_orte_map_parent, fragment).commit();
return v;
}
Wenn ich Schneide diese MapView-Sache auch alles funktionieren. Vielleicht kann mir jemand erklären, was ich falsch mache.
Meine komplette Stacktrace:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.*/com.*.MainActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.*.FragmentContact$1: make sure class name exists, is public, and has an empty constructor that is public
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
at android.app.ActivityThread.access$600(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5226)
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:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.*.FragmentContact$1: make sure class name exists, is public, and has an empty constructor that is public
at android.support.v4.app.Fragment.instantiate(Fragment.java:405)
at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1767)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:208)
at com.*.MainActivity.onCreate(MainActivity.java:20)
at android.app.Activity.performCreate(Activity.java:5104)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
... 11 more
Caused by: java.lang.InstantiationException: can't instantiate class com.*.FragmentContact$1; no empty constructor
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.support.v4.app.Fragment.instantiate(Fragment.java:394)
... 18 more
InformationsquelleAutor der Frage Osiriz | 2013-04-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Fehler nicht beschweren
FragmentContact
. Er beschwert sich über die erste innere KlasseFragmentContact
(FragmentContact$1
). Man kann nicht eineFragment
umgesetzt als innere Klasse von etwas, wie es nicht instanziiert werden kann, die von außerhalb der äußeren Klasse. Einstatic
innere Klasse ist in Ordnung.InformationsquelleAutor der Antwort CommonsWare
Ich habe dieses Thema für Alter und schließlich die Kommentare hier haben es gelöst für mich. Schöne Informationen über die
$1
Bedeutung anonyme innere Klasse.Bewegen Sie Ihre map-Initialisierung um ein neues Öffentlich-Klasse, z.B.
MyMapFragment.java
. Damit wird das fragment instanziiert werden, ohne die Instanz vonFür diejenigen, die noch nicht wissen wie Sie es beheben können. Schreiben Sie den code wie folgt (unter Verwendung der Beispiel-code von der ursprünglichen Frage):
Erstellen neue
MyMapFragment.java
so dass es nicht mehr um eine innere Klasse. Damit wird das fragment erstellt werden, ohne dass es äußere Klasse.Erstellen
MapLoadedCallback.java
zu erlauben, Sie zu behandeln, wenn die Karte fertig geladen ist und zum abrufen einer Instanz der geladenen map-ObjektInformationsquelleAutor der Antwort Matthew Cawley
wenn man dieses fragment,rufen Sie die statische Methode
getInstance
.InformationsquelleAutor der Antwort Eric