1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Probleme mit AlertDialog

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von scrats, 03.02.2010.

  1. scrats, 03.02.2010 #1
    scrats

    scrats Threadstarter Neuer Benutzer

    Beiträge:
    18
    Erhaltene Danke:
    0
    Registriert seit:
    25.01.2010
    Wie immer mach ich was falsch und komme nicht drauf!

    Die Idee war wenn man gewinnt, soll mit AlertDialog gezeigt werbden Gewonnen, bzw Verloren und dann das Spiel beenden (finish()) wieder zurück ins Hauptmenu.

    Code:
    protected Dialog onCreateDialog(int id) {
    
            AlertDialog.Builder builder;
            Log.v(TAG, "onCreateDialog");
            switch(id) {
            case DIALOG_WIN:
                Log.v(TAG, "Dialog: gewonnen");
                builder = new AlertDialog.Builder(this);
                builder.setMessage("Gewonnen");
                builder.setCancelable(false);
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int id) {
                               Log.v(TAG, "Dialog: Fehler?4");
                               finish();
                           }
                       });
                dialog = builder.create();
                break;
            case DIALOG_LOSE:
                Log.v(TAG, "Dialog: verloren");
                builder = new AlertDialog.Builder(this);
                builder.setMessage("Verlooooooooren")
                       .setCancelable(false)
                       .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int id) {
                               finish();
                           }
                       });
                dialog = builder.create();
                break;
            default:
                dialog = null;
            }
            return dialog;
        }
    
    Dies in der Activity Klasse drin und funktioniert auch!
    Aufrufen utu ich es so:

    showDialog(0);

    jetzt zu dem Problem:
    Beim ersten mal Spielen funktioniert alles normal. Ich Gewinne es kommt die Meldung. Ich drücke den Button und komme wieder ins Hauptmenu. Mach ich ein neues Spiel und gewinne(bzw. verliere) dieses stürzt die Aktivity ab.

    Meine vermutung liegt darin das der alte Dialog noch existiert. Ich habe es verucht bei der onDestroy mit:

    diablog.dismiss();
    oder
    diablog.cancel();

    beides funktioniert nicht!

    ***
    hier mal der FehlerCode ab dort wo ich aufrufe hab ich alles abgeschnitten
    Code:
    02-03 23:25:06.127: ERROR/AndroidRuntime(745): Uncaught handler: thread main exiting due to uncaught exception
    02-03 23:25:06.157: ERROR/AndroidRuntime(745): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@435c9318 is not valid; is your activity running?
    02-03 23:25:06.157: ERROR/AndroidRuntime(745):     at android.view.ViewRoot.setView(ViewRoot.java:425)
    02-03 23:25:06.157: ERROR/AndroidRuntime(745):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:178)
    02-03 23:25:06.157: ERROR/AndroidRuntime(745):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    02-03 23:25:06.157: ERROR/AndroidRuntime(745):     at android.view.Window$LocalWindowManager.addView(Window.java:392)
    02-03 23:25:06.157: ERROR/AndroidRuntime(745):     at android.app.Dialog.show(Dialog.java:231)
    02-03 23:25:06.157: ERROR/AndroidRuntime(745):     at android.app.Activity.showDialog(Activity.java:2407)
    02-03 23:25:06.157: ERROR/AndroidRuntime(745):     at com.pse.View.graphics2D.PlayArea2D.update(PlayArea2D.java:286)
    
     
    Zuletzt bearbeitet: 04.02.2010
  2. sebastian, 04.02.2010 #2
    sebastian

    sebastian Fortgeschrittenes Mitglied

    Beiträge:
    271
    Erhaltene Danke:
    74
    Registriert seit:
    11.05.2009
    Der Aufruf von AlertDialog ist nicht blockend, was heißt, du rufst showDialog(0) auf und er macht dann gleich mit dem was darunter kommt weiter!

    Vielleicht kommt dein Problem ja daher, dass du später etwas schließt, worauf er nach dem zweiten Aufruf von showDialog(x) wieder zugreifen möchte und dann die Exception fliegt?
     
  3. Andrawit, 23.09.2013 #3
    Andrawit

    Andrawit Junior Mitglied

    Beiträge:
    28
    Erhaltene Danke:
    0
    Registriert seit:
    13.09.2013
    Habe ein ähnliches Problem. Im TextView steht eine Telefonnummer die ich ändern können möchte. Es wird der Button "Ändern" geklickt, dann geht ein AlertDialog auf und man kann in der Eingabezeile die Telefonnummer ändern.


    Quellcode der Activity:
    Code:
    package boe.project.liftcall;
    import android.os.Bundle;
    import android.text.InputType;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.TextView;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    
    public class SetActivity extends Activity
    {
     TextView tvPhoneNo;
     Button butAendern;
     @Override
     protected void onCreate(Bundle savedInstanceState)
     {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_settings);
      
      Toast.makeText(getBaseContext(), "onCreate", Toast.LENGTH_SHORT).show();
      tvPhoneNo = (TextView)findViewById(R.id.tvPhoneNo);
      butAendern = (Button)findViewById(R.id.butAendern);
     
      //Anlegen des AlertDialogs
      final AlertDialog.Builder alert = new AlertDialog.Builder(this);
      alert.setTitle("SMS-Relais");
      alert.setMessage("Bitte Rufnummer eingeben.");
      final EditText input = new EditText(this);
      input.setInputType(InputType.TYPE_CLASS_PHONE);
      alert.setView(input);
        
       alert.setPositiveButton("OK", new DialogInterface.OnClickListener() 
       {
        @Override
        public void onClick(DialogInterface dialog, int which) 
        {
         tvPhoneNo.setText(input.getText());
        }
       });
      
       alert.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener()
       {
        @Override
        public void onClick(DialogInterface dialog, int which)
        {  
        }
       }); 
       
      butAendern.setOnClickListener(new View.OnClickListener()
      {
       @Override
       public void onClick(View v) 
       {
        alert.show();
       }
      });  
     } 
    }
    
    Fehlercode aus dem LogCat:
    Code:
    09-23 13:47:10.489: E/AndroidRuntime(732): FATAL EXCEPTION: main
    09-23 13:47:10.489: E/AndroidRuntime(732): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.view.ViewGroup.addViewInner(ViewGroup.java:1976)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.view.ViewGroup.addView(ViewGroup.java:1871)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.view.ViewGroup.addView(ViewGroup.java:1851)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at com.android.internal.app.AlertController.setupView(AlertController.java:365)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at com.android.internal.app.AlertController.installContent(AlertController.java:206)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.app.AlertDialog.onCreate(AlertDialog.java:251)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.app.Dialog.dispatchOnCreate(Dialog.java:307)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.app.Dialog.show(Dialog.java:225)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at boe.project.liftcall.SetActivity$3.onClick(SetActivity.java:64)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.view.View.performClick(View.java:2485)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.view.View$PerformClick.run(View.java:9080)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.os.Handler.handleCallback(Handler.java:587)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.os.Handler.dispatchMessage(Handler.java:92)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.os.Looper.loop(Looper.java:123)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at android.app.ActivityThread.main(ActivityThread.java:3683)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at java.lang.reflect.Method.invokeNative(Native Method)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at java.lang.reflect.Method.invoke(Method.java:507)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    09-23 13:47:10.489: E/AndroidRuntime(732):  at dalvik.system.NativeStart.main(Native Method)
    
     

Diese Seite empfehlen