Probleme beim Intentwechsel

  • Antworten:15
  • Bentwortet
dwjiidnsw
  • Forum-Beiträge: 58

30.05.2018, 18:48:34 via Website

Hallo,
wenn ich bei meiner App zwischen zwei Activities wechseln möchte bekomme ich diese Fehlermeldung:
java.lang.RuntimeException: Unable to start activity java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Die erste Activity besteht aus zwei RelativeLayouts, die in einem LinearLayout angeordnet sind.

Meine onCreate() in der MainActivity sieht so aus:

@Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    myView1 = new  MyView1(this);
    RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(480, 900);
    myView1.setLayoutParams(params1);
    RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativelayout);
    myView1.setBackgroundColor(Color.YELLOW);
    layout1.addView(myView1);

    myView2 = new MyView2(this);
    RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(300,300);
    myView2.setLayoutParams(params2);
    RelativeLayout layout1 = (RelativeLayout) findViewById(R.id.relativelayout);
    myView2.setBackgroundColor(Color.GREEN);
    layout2.addView(spielsteinAnzeige);
 }

Wie komme ich dann an den Viewparent?

Kommentieren
Beste Antwort
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.06.2018, 07:44:36 via App

Vielleicht ist das mit dem Singeton (getInstance) keine gute Idee.
so kann es nur eine View geben, die du addedest aber evtl willst du ja mehrere haben.
Bei Views ist sowas ungeschickt...

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
dwjiidnswJokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

30.05.2018, 20:23:27 via Website

Hallo
Du sagst du hast willst von einer Activity zu einer anderen wechseln. Das macht man mit einen Intent da kann ich in deinen Code nichts erkennen.

Die erste Activity besteht aus zwei RelativeLayouts, die in einem LinearLayout angeordnet sind.

Wo ist die zweite Activity?

Frage wieso Erstellst du nicht die beiden Layouts in XML in der „activty_main.xml“?
Wenn du das unbedingt in Java machen willst dann so.
ich habe die Zeile RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativelayout);
in LinearLayout geändert da du sagst das in einem LinearLayout zwei Rlative sind oder rein sollen.
Also denke ich das den main Layout ein LinearLayout ist, mit der ID R.id.relativelayout.

    myView1 = new  MyView1(this);
    RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(480, 900);
    myView1.setLayoutParams(params1);
    LinearLayout layout = (LinearLayout) findViewById(R.id.relativelayout);
    myView1.setBackgroundColor(Color.YELLOW);
    layout.addView(myView1);

    myView2 = new MyView2(this);
    RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(300,300);
    myView2.setLayoutParams(params2);
    LinearLayout layout2 = (LinearLayout) findViewById(R.id.relativelayout);
    myView2.setBackgroundColor(Color.GREEN);
    layout2.addView(myView2);

Wo hast du das Relativlayout erstellt ist das in der MyView Klasse.
Zeige auch dein XML file und die MyView Klasse.

— geändert am 30.05.2018, 20:34:06

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.05.2018, 20:31:05 via Website

Hallo,
irgendwie bringst du ein paar Dinge durcheinander:

Aus deiner Überschrift: "Intentwechsel" --> Ich erwarte, dass du Intents benutzt um Activities zu wecheln

Aus deinem Code: Du instanziierst 2 Views und addest diese auf ein Layout.

Ist diese "MyView2" auch ein View Objekt oder doch eine Activity.

Einen Activitywechsel macht man i.d.r so:

Intent intent = new Intent(this,MyNewActivity.class);
startActivity(intent);

Der Code würde nun eine 2. Activity öffnen, die ein anderes Layout hat, aber das kannst du nicht aus der onCreate aufrufen, dann würdest du eine MainActivity nicht mehr sehen.

Was hast du denn eigentlich vor? Und was genau sind deine MyView* für Objekte (Code?)

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
dwjiidnsw
  • Forum-Beiträge: 58

30.05.2018, 21:52:39 via Website

Ich benutze ja auch Intents um zwischen den beiden Activitys zu wechseln, dann tritt nur die obige Fehlermeldung auf.
Ich habe nur den Codeabschnitt oben gepostet, weil dort die Fehlermeldung kommt.
Das oben ist auch nur die eine Activity auf der eben 2 relative Layouts sind. Meine Frage war nur,wenn ich zwischen den Activitys wechsle, wie ich dann vorher die Views auf dem Layout entferne. (Wie in der Fehlermeldung you must call removeView()....)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

30.05.2018, 21:59:53 via Website

Hallo wie so willst du die Views überhaupt entfernnen wenn du sowieso eine neue Activity startest .
in der Zweiten Activity lädst du doch ein neues anders Layout.
Wenn du zurück zur ersten gehst ist die Activity zerstört und wird wieder neu geladen.

— geändert am 30.05.2018, 22:08:17

Hilfreich?
Kommentieren
dwjiidnsw
  • Forum-Beiträge: 58

30.05.2018, 22:50:04 via Website

Naja, die Fehlermeldung sagt ja das ich was entfernen muss.
Es ist jetzt auch ziemlich komisch, wenn ich jetzt zwischen den Activitys wechsle steht erst Android stopped oder so ähnlich und nach einiger Zeit wird die andere Activity aber dennoch geladen.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.05.2018, 00:38:13 via App

Du musst uns schon deinen Code zeigen sonst können wir nicht viel helfen...

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
dwjiidnsw
  • Forum-Beiträge: 58

31.05.2018, 15:07:29 via Website

Ok, ich erkläre es nochmal genauer.
Ich habe zwei Activities, einmal die MainActivity und die GameOverScreen Activity.
Die MainActivity hat ein LinearLayout auf dem zwei RelativeLayouts mit jeweils einer View angeordnet sind und die GameOverScreen Activity besteht aus einem RelativeLayout. ( ich hatte es schon mal genauso gemacht, da bestand die MainActvity nur aus einer View und da hat es geklappt, also liegt es an wahrscheinlich daran das die MainActivity aus zwei Views besteht).

Der Intentwechsel in der Gameoverscreen Activity:

@Override
 public boolean onTouch(View v, MotionEvent event) {
    int aktion = event.getAction();

    if(aktion==MotionEvent.ACTION_DOWN) {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        return true;
    }

    return false;
  }

Die GameOverscreen Activity starte ich genauso bei einem GameOver.
Die beiden View füge ich wie oben zur MainActivity hinzu

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.05.2018, 15:33:43 via Website

Und wie sehen die Views aus? Funktionieren diese an sihc?
Dein Code aus der MainAcitivtiy macht keinen Sinn, wenn wir nicht wissen, wo was definiert ist:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

myView1 = new  MyView1(this);
RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(480, 900);
myView1.setLayoutParams(params1);
RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativelayout); //Layout auf r.layout.main suchen
myView1.setBackgroundColor(Color.YELLOW);
layout1.addView(myView1); //Woher kommt "layout1", das wurde zu diesem Zeitpunkt nicht definiert, ergo = null...

myView2 = new MyView2(this);
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(300,300);
myView2.setLayoutParams(params2);
RelativeLayout layout1 = (RelativeLayout) findViewById(R.id.relativelayout);//warum hier layout1 das nutzt du doch oben schon
myView2.setBackgroundColor(Color.GREEN);
layout2.addView(spielsteinAnzeige); //was ist spielstein anzeige? Eine View? und die wird wo initialisiert??

}

In welche Zeile tritt denn der Fehler auf (steht in der Exception Messag?) was tut dein Code da?
Ohne die kompletten zusammenhänge zu kennen, ist die Hilfe immer schwierig.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
dwjiidnsw
Kommentieren
dwjiidnsw
  • Forum-Beiträge: 58

31.05.2018, 15:44:28 via Website

Die Views funktionieren und auch der Wechsel zum GameOverscreen ohne Probleme, nur wenn ich dann wieder zurück wechsle kommt die Fehlermeldung.

Das ist die komplette Fehlermeldung, aber wie gesagt wenn ich dann bei "Tetris has stopped" auf Ok drücke lädt die andere Activity trotdem:

05-31 09:18:00.300 2547-2547/com.example.admin.tetris E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.admin.tetris, PID: 2547
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.admin.tetris/com.example.admin.tetris.MainActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:3562)
at android.view.ViewGroup.addView(ViewGroup.java:3415)
at android.view.ViewGroup.addView(ViewGroup.java:3360)
at android.view.ViewGroup.addView(ViewGroup.java:3336)
at com.example.admin.tetris.MainActivity.onCreate(MainActivity.java:74)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)

  private RelativeLayout relativeTetris;
  private RelativeLayout relativeSpielSteinAnzeige;

@Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(relativeTetris!=null && relativeSpielSteinAnzeige!=null) { // hier habe ich versucht vorher die Views zu entfernen, bringt aber auch nichts
        ((ViewGroup)relativeTetris.getParent()).removeView(relativeTetris);
        ((ViewGroup)relativeSpielSteinAnzeige.getParent()).removeView(relativeSpielSteinAnzeige);


    tetris = new Tetris(this); // View
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(480, 900);
    tetris.setLayoutParams(params);
    relativeTetris = (RelativeLayout) findViewById(R.id.relativelayout);
    tetris.setBackgroundColor(Color.YELLOW);
    relativeTetris.addView(tetris);

    spielSteinAnzeige = SpielsteinAnzeige.getInstance(this); // View
    RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(300,300);
    spielSteinAnzeige.setLayoutParams(params1);
    relativeSpielSteinAnzeige = (RelativeLayout) findViewById(R.id.relativelayout1);
    spielSteinAnzeige.setBackgroundColor(Color.GREEN);
    relativeSpielSteinAnzeige.addView(spielSteinAnzeige);
}

— geändert am 31.05.2018, 15:48:00

Hilfreich?
Kommentieren
dwjiidnsw
  • Forum-Beiträge: 58

31.05.2018, 23:30:22 via Website

Hallo,
es ist jetzt so das wenn ich die spielSteinAnzeige rausnehme(also eine View von der Activity, der Intentwechsel problemlos funktioniert) Dann liegt also daran, dass ich zwei Views zur Activity hinzufüge.
Wieso tauchen dann diese Probleme auf, wenn zwei Views zur Activity hinzugefügt werden?

Hilfreich?
Kommentieren
Beste Antwort
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.06.2018, 07:44:36 via App

Vielleicht ist das mit dem Singeton (getInstance) keine gute Idee.
so kann es nur eine View geben, die du addedest aber evtl willst du ja mehrere haben.
Bei Views ist sowas ungeschickt...

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
dwjiidnswJokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

01.06.2018, 09:03:36 via Website

Hallo
mal als Tipp hierzu.

if(relativeTetris!=null && relativeSpielSteinAnzeige!=null) { // hier habe ich versucht vorher die Views zu entfernen, bringt aber auch nichts

Wenn du die views entfernen willst dann nicht in der onCreate sondern entweder in der onPause, onStop, onDestroy.

Wenn du wieder zurück zur MainActivity kommst wird dir die gleiche Instanz auf deine View gegeben.
Denn die ist static (Singeton) im letzten Post hast du ja die Klasse gepostet. Die Instanz wird nicht beim Intent von Main zu GameO zerstört.

Ps. Du willst das es deine Spielstein Klasse nur ein mal gibt. Nur warum Singelton? Du Programmierst ein Spiel und nicht zB. eine Lib die dann von anderen benutzt wird. Da kannst du selber auf passen das es die nur einmal gibt.
Wie ich schon sagte wenn man was entfernen, Speicher zurückgeben... will dafür sind die drei Methoden da.

http://www.programmierenlernenhq.de/tutorial-android-activity-und-fragment-lifecycle/

Ps.2.
Bitte erstelle nicht einen anderen gekürzten Code aus deinem Original den du dann zum Fragen beginn Postest. Gib uns gleich das Original.

— geändert am 01.06.2018, 09:47:33

Hilfreich?
dwjiidnsw
Kommentieren
dwjiidnsw
  • Forum-Beiträge: 58

01.06.2018, 23:41:44 via Website

Danke, jetzt funktioniert es:)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

02.06.2018, 07:21:34 via Website

Hi ja schön und noch schöner wäre wenn du uns sagen würdest was es den nun war. Hast du das löschen in den Methoden gemacht , oder den Singelton aufgelöst.
Lass uns doch bitte nicht so im Dunkeln stehen.
LG J.

Hilfreich?
Pascal P.
Kommentieren
dwjiidnsw
  • Forum-Beiträge: 58

02.06.2018, 14:02:55 via Website

Pascal P. hat den entscheidenen Hinweis gegeben mit dem Singleton, das habe ich aufgelöst, war irgendwie auch unnötig.

Hilfreich?
Kommentieren