Daten aus Dialog Fenstern in einer TextView anzeigen

  • Antworten:15
  • Bentwortet
Syntac Moore
  • Forum-Beiträge: 44

23.04.2014, 19:11:12 via Website

Ich hab mich jetzt mal etwas mit Dialogs auseinander gesetzt und das ganze mal in einer Test App probiert. Also was ich machen will. Ich hab ein Layout mit 3 Buttons und einer TextView, wenn man auf einen Button klickt erscheint ein Dialog Fenster, im ersten gibt man einen Namen ein, im zweiten hat man eine Liste aus der man eins auswählen kann und im 3. hat man eine Liste aus der man viele Sachen auswählen kann. Nachdem man alles ausgewählt hat drückt man immer schön auf ok und das ganze soll dann in der TextView angezeigt werden. Alles funktioniert nur das Anzeigen nicht.

Hier mal die Methode für den ersten Dialog

// PizzaName Dialog
public void pizzaNameDialog() {
    // Variables
    dialogBuilder = new AlertDialog.Builder(this);
    final EditText txtInput = new EditText(this);
    strName = "Pizza Name: ";

    // Process
    dialogBuilder.setTitle("Gib deiner Pizza einen Namen");
    dialogBuilder.setMessage("Wie heißt deine Pizza?");
    dialogBuilder.setView(txtInput);
    dialogBuilder.setPositiveButton("Ok",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    strName = txtInput.getText().toString();

                    Toast.makeText(getApplicationContext(),
                            "Pizza wurde benannt.", Toast.LENGTH_SHORT)
                            .show();

                }
            });
    dialogBuilder.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    Toast.makeText(getApplicationContext(),
                            "Pizza wurde nicht benannt.",
                            Toast.LENGTH_SHORT).show();
                }
            });
    // Output
    AlertDialog dialogPizzaName = dialogBuilder.create();
    dialogPizzaName.show();
}

Der Name wird dann in strName erstmal gespeichert. Dann gibt es die Display-Methode die das ganze dann in der TextView anzeigen lassen soll.

TextView lblPizzaOrder = (TextView) findViewById(R.id.textView1);
    lblPizzaOrder.setText(strOrder);

und die eig Methode

public void Display() {
    strOrder = "Current Pizza:\n" + strName + "\n" + strBelag + "\n"
            + strPizzaSize;
    lblPizzaOrder.setText(strOrder);
}

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.04.2014, 20:37:59 via Website

Was ist wenn du einen Text in der OnCrate setzt, wird dieser angezeigt? Gibt es irgendwelche LogCat Fehler

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

Antworten
Syntac Moore
  • Forum-Beiträge: 44

23.04.2014, 21:05:21 via Website

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ******************************************** Button btnPizzaName = (Button) findViewById(R.id.btxPizzaName); btnPizzaName.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            pizzaNameDialog();

        }
    });

    // *********************************************************************
    Button btnPizzaSize = (Button) findViewById(R.id.btxGroesse);
    btnPizzaSize.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            pizzaSizeDialog();

        }
    });
    // *********************************************************************
    Button btnPizzaBelag = (Button) findViewById(R.id.btxBelag);
    btnPizzaBelag.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            pizzaBelagDialog();
        }
    });
    // *************************************************************************
    TextView lblPizzaOrder = (TextView) findViewById(R.id.textView1);
    lblPizzaOrder.setText(strOrder);
}

// *******************************************************************

Es ist bereits im onCreate. Und LogCat Fehler bekomme ich auch nicht, das ist ja was mich am meisten nervt..

— geändert am 23.04.2014, 21:08:43

Antworten
Syntac Moore
  • Forum-Beiträge: 44

23.04.2014, 21:07:46 via Website

Und wenn ich die Display Methode ins onCreate hinzufüge erhalte ich diesen Fehler:

04-23 19:06:16.772: D/AndroidRuntime(471): Shutting down VM 04-23 19:06:16.772: W/dalvikvm(471): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 04-23 19:06:16.783: E/AndroidRuntime(471): FATAL EXCEPTION: main 04-23 19:06:16.783: E/AndroidRuntime(471): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.pm/de.pm.MainActivity}: java.lang.NullPointerException 04-23 19:06:16.783: E/AndroidRuntime(471): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 04-23 19:06:16.783: E/AndroidRuntime(471): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 04-23 19:06:16.783: E/AndroidRuntime(471): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 04-23 19:06:16.783: E/AndroidRuntime(471): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 04-23 19:06:16.783: E/AndroidRuntime(471): at android.os.Handler.dispatchMessage(Handler.java:99) 04-23 19:06:16.783: E/AndroidRuntime(471): at android.os.Looper.loop(Looper.java:123) 04-23 19:06:16.783: E/AndroidRuntime(471): at android.app.ActivityThread.main(ActivityThread.java:4627) 04-23 19:06:16.783: E/AndroidRuntime(471): at java.lang.reflect.Method.invokeNative(Native Method) 04-23 19:06:16.783: E/AndroidRuntime(471): at java.lang.reflect.Method.invoke(Method.java:521) 04-23 19:06:16.783: E/AndroidRuntime(471): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 04-23 19:06:16.783: E/AndroidRuntime(471): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 04-23 19:06:16.783: E/AndroidRuntime(471): at dalvik.system.NativeStart.main(Native Method) 04-23 19:06:16.783: E/AndroidRuntime(471): Caused by: java.lang.NullPointerException 04-23 19:06:16.783: E/AndroidRuntime(471): at de.pm.MainActivity.Display(MainActivity.java:199) 04-23 19:06:16.783: E/AndroidRuntime(471): at de.pm.MainActivity.onCreate(MainActivity.java:62) 04-23 19:06:16.783: E/AndroidRuntime(471): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 04-23 19:06:16.783: E/AndroidRuntime(471): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 04-23 19:06:16.783: E/AndroidRuntime(471): ... 11 more 04-23 19:06:18.573: I/Process(471): Sending signal. PID: 471 SIG: 9

Aber die Methode hat dort doch eig nichts zu suchen, oder?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.04.2014, 21:23:01 via Website

Wie wäre es mit dem: at de.pm.MainActivity.Display(MainActivity.java:199) 04-23 19:06:16.783: E/AndroidRuntime(471):

So was steht in der Mainactivity.java Zeile 199?

2. Wo wird diese Zeile Aufgerufen?

TextView lblPizzaOrder = (TextView) findViewById(R.id.textView1);

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

Antworten
Syntac Moore
  • Forum-Beiträge: 44

23.04.2014, 21:31:42 via Website

Also in Zeile 199 steht:

lblPizzaOrder.setText(strOrder);

Das ist Teil der Display Methode. Kann es sein, dass es nicht funktioniert, weil die Zeile doppelt vorkommt?

Und zu 2. Die Zeile wird noch im onCreate aufgerufen.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.04.2014, 21:45:17 via Website

Nein, ich glaube eher, dass die TextView variable null ist und deswegen kein Text gesetzt werden kann. Am besten du definierst die TextView als Klassenvariable dann passt es. Wenn du das schon hast, dann würde ich versuchen die View in deiner Display Methode einfach nochmal per find vom Layout zu lesen

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

Antworten
Syntac Moore
  • Forum-Beiträge: 44

23.04.2014, 22:17:53 via Website

Ich weiß nicht was ich falsch mache, aber irgendwie klappst immer noch nicht.

public class MainActivity extends Activity {
private static TextView lblPizzaOrder;
private String strOrder = "Current Pizza:", strBelag = " \nBelag: ",
        strName = "Pizza Name: ", strPizzaSize = "\nGröße: ";
private AlertDialog.Builder dialogBuilder;

// **********************************************************
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // ******************************************************************************
    Button btnPizzaName = (Button) findViewById(R.id.btxPizzaName);
    btnPizzaName.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            pizzaNameDialog();

        }
    });

    // *********************************************************************
    Button btnPizzaSize = (Button) findViewById(R.id.btxGroesse);
    btnPizzaSize.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            pizzaSizeDialog();

        }
    });
    // *********************************************************************
    Button btnPizzaBelag = (Button) findViewById(R.id.btxBelag);
    btnPizzaBelag.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            pizzaBelagDialog();
        }
    });
    // *************************************************************************

    TextView lblPizzaOrder = (TextView) findViewById(R.id.textView1);
    lblPizzaOrder.setText(strOrder);

}

// *******************************************************************
// PizzaName Dialog
public void pizzaNameDialog() {
    // Variables
    dialogBuilder = new AlertDialog.Builder(this);
    final EditText txtInput = new EditText(this);
    strName = "Pizza Name: ";

    // Process
    dialogBuilder.setTitle("Gib deiner Pizza einen Namen");
    dialogBuilder.setMessage("Wie heißt deine Pizza?");
    dialogBuilder.setView(txtInput);
    dialogBuilder.setPositiveButton("Ok",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    strName = txtInput.getText().toString();

                    Toast.makeText(getApplicationContext(),
                            "Pizza wurde benannt.", Toast.LENGTH_SHORT)
                            .show();

                }
            });
    dialogBuilder.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    Toast.makeText(getApplicationContext(),
                            "Pizza wurde nicht benannt.",
                            Toast.LENGTH_SHORT).show();
                }
            });
    // Output
    AlertDialog dialogPizzaName = dialogBuilder.create();
    dialogPizzaName.show();

}

// Pizza Größe Dialog
public void pizzaSizeDialog() {
    // Variables
    dialogBuilder = new AlertDialog.Builder(this);
    final String[] strSize = { "Klein", "Mittel", "Groß", "Familienpizza" };
    strPizzaSize = "\nSize: ";

    // Process
    dialogBuilder.setTitle("Wähle eine Größe");
    dialogBuilder.setSingleChoiceItems(strSize, -1,
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    strPizzaSize = strSize[which];

                    Toast.makeText(getApplicationContext(),
                            "Größe wurde ausgewählt.", Toast.LENGTH_SHORT)
                            .show();
                    dialog.dismiss();
                }
            });
    // Output
    AlertDialog dialogPizzaSize = dialogBuilder.create();
    dialogPizzaSize.show();

}

// **********************************************************************
// Belag Dialog

private void pizzaBelagDialog() {
    // Variablen
    final ArrayList arrayBelag = new ArrayList();
    dialogBuilder = new AlertDialog.Builder(this);
    final String[] strBelaege = { "Hühnchen", "Pepperoni", "Pilze",
            "Zwiebeln", "Speck", "Oliven", "Ananas", "Pommes", "Soße",
            "Meeresfrüchte" };

    // Process
    strBelag = "\nBelag:\n";
    dialogBuilder.setTitle("Wähle deinen Belag aus");
    dialogBuilder.setMultiChoiceItems(strBelaege, null,
            new DialogInterface.OnMultiChoiceClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which,
                        boolean isChecked) {

                    if (isChecked) {
                        arrayBelag.add(which);
                    } else if (arrayBelag.contains(which)) {
                        arrayBelag.remove(Integer.valueOf(which));
                    }
                }
            });
    dialogBuilder.setPositiveButton("Ok",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    for (int intLoop = 0; intLoop < arrayBelag.size(); intLoop++) {
                        strBelag = strBelaege[(Integer) arrayBelag
                                .get(intLoop)] + ", ";
                    }

                    Toast.makeText(getApplicationContext(),
                            "Belag wurde ausgewählt.", Toast.LENGTH_SHORT)
                            .show();

                }
            });
    dialogBuilder.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(getApplicationContext(),
                            "Belag wurde nicht ausgewählt.",
                            Toast.LENGTH_SHORT).show();

                }
            });
    // Output
    AlertDialog dialogPizzaBelag = dialogBuilder.create();
    dialogPizzaBelag.show();

}

// ******************************************************************************
public void Display() {
    TextView lblPizzaOrder = (TextView) findViewById(R.id.textView1);
    strOrder = "Current Pizza:\n" + strName + "\n" + strBelag + "\n"
            + strPizzaSize;

    lblPizzaOrder.setText(strOrder);
}

// *******************************************************************************
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

}

Die TextView ist jetzt als Klassenvariable deklariert. Und ich habe auch das probiert mit dem Ändern der Display Methode, also dort die TV vom Layout zu lesen, hat aber auch nicht funktioniert.

Was mir auch noch aufgefallen ist. Mein Layout sollte ja das Anzeigen: Current Pizza:

Belag:

Name:

Größe:

Aber es ist nur Current Pizza zu sehen.

Ich werd jetzt noch einmal das Projekt sorgfältig durchsehen, vll hab ich ja was übersehen. Ich weiß es ist viel verlangt, aber ich würde mich echt freuen, wenn du dir den Code anschauen könntest :)

Und Danke für deine Hilfe bis jetzt! ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.04.2014, 22:23:31 via Website

mach dir mal ein Paar logs rein Mit Log.d(); vlt ist der Debugmodus sinnvoll, da dudann deine String var überprüfen kannst

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

Antworten
Syntac Moore
  • Forum-Beiträge: 44

23.04.2014, 22:45:04 via Website

Ich hab das jetzt mal durch den Debugmodus laufen lassen, ich hab in der Zeile mit der TV einen Breakpoint gesetzt und hab am Schluss bei Variablen das raus:

this MainActivity (id=830103312072) btnPizzaBelag Button (id=830103337272)
btnPizzaName Button (id=830103331296)
btnPizzaSize Button (id=830103335032)
savedInstanceState null

Bezieht sich das savedInstanceState null auf die TV?

Und das kam auch noch raus. Ich hab noch nie den Debugmodus verwendet deswegen sagt mir das ehrlich gesagt nicht viel

PM [Android Application]
PM [Android Application]
PM [Android Application]
DalvikVM[localhost:8615]
Thread [<1> main] (Suspended (breakpoint at line 62 in MainActivity))
MainActivity.onCreate(Bundle) line: 62
Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1047
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2627 ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2679
ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 125
ActivityThread$H.handleMessage(Message) line: 2033 ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123 ActivityThread.main(String[]) line: 4627
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 868 ZygoteInit.main(String[]) line: 626 NativeStart.main(String[]) line: not available [native method]
Thread [<6> Binder Thread #2] (Running) Thread [<5> Binder Thread #1] (Running)

— geändert am 23.04.2014, 22:45:22

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.04.2014, 22:52:25 via Website

scheint ok zu sein, das sind aber nur die Buttons und nicht das TextLabel richtig? Was steht denn in der TextView var drinne?

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

Antworten
Syntac Moore
  • Forum-Beiträge: 44

23.04.2014, 23:14:01 via Website

Das ist alles was ich bekommen hab. Ich habs jetzt mehrmals debuggen lassen, aber kam immer dasselbe raus. Könnte es evtl. sein das die TextView gar nicht erkannt wird? Wobei das ja eig nicht sein kann, da ja selbst der Import vorhanden ist, oder?

Antworten
impjor
  • Forum-Beiträge: 1.793

23.04.2014, 23:15:21 via App

Du setzt den Text der TextView am Ende der onCreate(), da stehen deine Eingaben aber noch gar nicht fest. Du musst irgendwann die Methode display() aufrufen, z.B. nach jedem Anzeigen eines Dialogs.

Edit: vermeide static Variabeln. Auch in diesem Fall unnötig.

— geändert am 23.04.2014, 23:17:01

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Syntac Moore

Antworten
Syntac Moore
  • Forum-Beiträge: 44

23.04.2014, 23:45:06 via Website

Danke!! Jetzt klappts endlich! :D

So halber..

Also sobald ich den Namen eingeb passiert nichts, erst wenn ich den zweiten Button drücke, erscheint der Name, im Prinzip muss ich immer zuerst einen anderen Button drücken bevor das im Dialog davor ausgewählte angezeigt wird. Aus diesem Grund steht nie alles auf ein Mal da, es fehlt immer eine Angabe.

Antworten
impjor
  • Forum-Beiträge: 1.793

23.04.2014, 23:49:55 via App

Dann wird die Display() Methode ausgeführt, bevor der Dialog beendet wurde. Du musst sie aufrufen, wenn der Benutzer den OK/Cancel(?) Button drückt.

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Syntac Moore

Antworten
Syntac Moore
  • Forum-Beiträge: 44

24.04.2014, 00:19:10 via Website

Jap jetzt klaptps :D

Vielen Dank! :)

Antworten