Anfängerhilfe für Buttons

  • Antworten:17
  • Bentwortet
Gunne
  • Forum-Beiträge: 7

08.12.2013, 21:52:13 via Website

Hallo, gleich zu Anfang: Ich bin noch ein absoluter Androidanfänger und hoffe deswegen auf simple Erklärungen :)

Folgendes:
Als meine erste App möchte ich einfach mal "Schere Stein Papier Echse Spock" programmieren.
Ich bin mitlerweile soweit, dass ich durch Buttons neue Activitys starten kann, die Menüführung klappt also fürs erste.
Als nächstes möchte ich, dass man wenn man auf einen von 5 Buttons (Schere Stein...) klickt, in der gleichen Activity auf einer bisher leeren Fläche über den Buttons eine Auswertung in Form einer Textview erscheint.
Bisher weiß ich allerdings nur, wie man durch das onClick Attribut andere Activitys aufruft.
Was muss ich tun, um nach dem Klicken des Buttons die beschriebene Auswertung erscheinen zu lassen?

Bin für jede Hilfe dankbar :)

Antworten
impjor
  • Forum-Beiträge: 1.793

08.12.2013, 22:01:56 via App

Fürs erste würde ich dir empfehlen, nur Schere, Stein & Papier zu benutzen.
Da du ja weißt, wie du eine Aktion bei Klick auf dem Button ausführt, brauchst du nur noch den Befehl, den Text der TextView zu ändern. Der steht aber wirklich in jedem Tutorial, am besten du arbeitest z.B. das Training auf d.android.com durch. Der Befehl ist setText().
Das grösere Problem sollte aber nicht der Button-Klick, sondern die Spiellogik sein, oder? Also wer gewonnen hat. Dazu überlege dir genau, was die App machen soll, ohne konkrete Fragen kann man dir dabei nicht wirklich helfen, ohne den kompletten Code zu posten.

LG

Liebe Grüße impjor.

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

Gunne

Antworten
Gunne
  • Forum-Beiträge: 7

08.12.2013, 22:07:35 via Website

Erst mal Danke für den Befehl. :D
Selbstverständlich muss die Auswertung auch von einer Zufallsvariable mit 5 bzw. 3 Optionen abhängig sein, welche dann "die Wahl des Computers" darstellt.
Ich probier damit erstmal herum und melde mich bei Bedarf.

— geändert am 08.12.2013, 22:17:21

Antworten
JOnas S
  • Forum-Beiträge: 2.256

08.12.2013, 22:19:26 via App

Hi,
wenn ich es richtig verstanden habe willst du wenn man auf einen der 5 buttons klickt den entsprechenden Text im textview anzeigen.
Als erstes musst du die void raus suchen die ausgeführt wird wenn der button angeklickt wird die sieht etwa so aus
1public void onClick(){
2Intent i = …;
3startActivity(i);
4}
Dort entfernst du Intent i = …;
startActivity und erstellst eine Verknüpfung zum texview, danach gibst du dem textview einen Text also textview.setText("dein Text"); .
Nun musst du zu jeden deiner buttons einen onClickListener hinzufügen und dein Text wird angezeigt. Um bei jeden einzelnen button einen anderen Text anzuzeigen musst du switch und case nehmen such das einfach bei google suchen: http://lmgtfy.com/?q=android+Switch+case

gruß Jonas ||Galaxy S with cm10.1 4.2.1|| gegen überlange Zitate

Gunne

Antworten
Gelöschter Account
  • Forum-Beiträge: 180

08.12.2013, 22:28:51 via App

dieses public void und der ganze mist ist doch java ? laufen alle Handys uber Java ?

Antworten
Gunne
  • Forum-Beiträge: 7

08.12.2013, 22:30:00 via Website

Ich bin zwar Anfänger, aber soweit ich weiß, ist Android weitestgehend Java-basiert.

Antworten
Gunne
  • Forum-Beiträge: 7

08.12.2013, 23:01:35 via Website

Ich weiß, dass es eigentlich eine Frage ist, die ich nicht mehr stellen müssen sollte, aber wie bringe ich so eine Verknüpfung, besonders in Bezug auf die Syntax, zu Stande?

meine Codeschnipsel sehen bisher folgendermaßen aus:

activity_single_player.xml
1<ImageButton
2 android:id="@+id/imageButton_rock"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:layout_above="@+id/imageButton_paper"
6 android:src="@drawable/rock"
7 android:onClick="rock" />

1<TextView
2 android:id="@+id/textView_yourChoice"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:layout_centerHorizontal="true"
6 android:text="@string/empty"
7 android:textAppearance="?android:attr/textAppearanceLarge" />

SinglePlayer.java

1public void rock() {
2 textView_yourChoice.setText("@string/your_choice_rock");
3 }

Antworten
Barbaric Chicken
  • Forum-Beiträge: 66

09.12.2013, 09:17:09 via Website

Hi,

1public void rock(View buttonName){}

Viele Grüße

Gunne

Antworten
Fabian Simon
  • Forum-Beiträge: 359

09.12.2013, 10:50:57 via Website

Hallo,
ich kanns mir leider nicht verkneifen.
Hab früher auch immer gedacht "ist doch egal wie man das nennt haupsache man versteht was gemeint ist".
Aber Verknüpfung ? --> Das lässte ne menge Interpreditationsmöglichkeiten offen.
Wenn das was Barbaric geschrieben habt redet ihr von einem Parameter. (um genau zu seine vom einem Formalparameter. Dem dann per Aktualparameter in diesem Fall eine Reverenz von Typ View übergeben wird....).

Will nicht klugscheißen oder so, dachte nur ich kann vielleicht mit der Verwendung der Fachwörter unterstützen.

Also:
Parameter
-> Formal (Wird in methoden kopf definiert)
-> Aktual (ist die aktuelle Variable die der Mehtode übergeben wird)
-> Beides irgendwie eine verknüpfung
Variabeln
Call by Value --> z.B bei Strings, zahlen, bollischen werten. Wenn einer Methode ein Wert einer "flachen" Struktur übergeben wird, wird eine Harte kopie dieses Wert gemacht (keine Verknüpfung). Im Heap befindet sich diese Varibale 2 mal.

Call by Refernez --> Bei allen anderen (zb.: eine Variable des Typs View). Legt nur einen Verweis auf den Selben Heapbereich an.
Das heißt egal wo eine Änderung erfolgt, alle Verweise wissen darüber bescheind. (Meiner meinung nach sowas von ne verknüpfung).


Worauf ich hinaus möchte: Verknüpfung ist vielleicht nicht die beste Beschreibung.

Gruß
Fabian

Gunne

Antworten
impjor
  • Forum-Beiträge: 1.793

09.12.2013, 13:40:49 via App

Gunne
1public void rock() {
2 textView_yourChoice.setText("@string/your_choice_rock");
3 }
Falsch!!! Du verwechselst hier xml mit Java! Du kannst nur indirekt auf das andere zugreifen. Für setText() brauchst du ein TextView-Objekt. Also TextView tv = ...;
tv.setText(...);
Um ein View Objekt aus dem aktuellen Layout zu bekommen nutzt du findViewById(R.id.dieIdDerView);
Nun kann eine View ein TextView sein, muss aber nicht. Deshalb kannst du setText nicht auf einer View aufrufen, sondern nur auf TextView. Deshalb kannst du TextView tv = (TextView) view; benutzen, um view zu einer TextView "umzuwandeln" (casten).
Dein @string/usw. ist auch nicht korrekt. Benutze dafür R.string.usw

Das steht aber alles in jedem Anfänger-Tutorial (sogar in den deutschen!). Bitte schau dir doch diese mal an.

LG

Liebe Grüße impjor.

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

Gunne

Antworten
impjor
  • Forum-Beiträge: 1.793

09.12.2013, 13:44:18 via App

Spiro Tok
dieses public void und der ganze mist ist doch java ? laufen alle Handys uber Java ?
Mal abgesehn davon, dass das OT ist und viele Sprachen "public void" enthalten, werden die Android-Apps mit Java geschrieben.
"Laufen" tun Handys aber über Maschinenbefehle, die mit jeder Sprache erzeugt werden können, für die es einen entsprechenden Compiler gibt.

LG

Liebe Grüße impjor.

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

Antworten
Gunne
  • Forum-Beiträge: 7

09.12.2013, 20:03:20 via Website

Okay ich danke allen schonmal für die Hilfe, das Editieren des Textes durch die Buttons funktioniert nun :) Ich lasse den Thread vorerst offen, sollten noch Fragen bezüglich der Zufallsvariable oder deren Auswertung auftreten.

Falls es interessiert, mein bisheriges Ergebnis sieht folgendermaßen aus:

1public void rock(View imageButton_rock){
2 TextView tv0 = (TextView)findViewById(R.id.textView_choose);
3 TextView tv1 = (TextView)findViewById(R.id.textView_yourChoice);
4 tv0.setText(R.string.empty);
5 tv1.setText(R.string.your_choice_rock);
6 }

Dabei ist choose ein Textfeld, welches quasi überschrieben werden soll

mfg

Antworten
Christian
  • Forum-Beiträge: 307

10.12.2013, 12:24:30 via Website

Hi Gunne,

noch ein kleiner Tipp am Rande.

Die Methode findViewById solltest du in die oncreate-Methode deiner Activity verlagern und die beiden TextViews als Klassenvariablen deklarieren.
Dann muss nicht bei jedem Button-Klick die Layout-XML nach den beiden TextViews durchsucht werden.

Mfg Christian

— geändert am 10.12.2013, 12:24:50

GunneFabian Simon

Antworten
Gunne
  • Forum-Beiträge: 7

14.12.2013, 01:22:07 via Website

Christian Hempe

Die Methode findViewById solltest du in die oncreate-Methode deiner Activity verlagern und die beiden TextViews als Klassenvariablen deklarieren.

Stimmt, das leuchtet mir aus Effiziensgründen vollkommen ein. Jedoch habe ich zur Umsetzung eine Frage. Es ist scheinbar nicht möglich static innerhalb einer Methode, wie onCreate eine ist, in Bezug auf eine Variable zu verwenden. Der Code sieht derzeit folgendermaßen aus:

1@Override
2 public void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4 setContentView(R.layout.activity_single_player);
5 setupActionBar();
6 TextView tv0 = (TextView)findViewById(R.id.textView_choose);
7 TextView tv1 = (TextView)findViewById(R.id.textView_yourChoice);
8 TextView tv2 = (TextView)findViewById(R.id.textView_enemyChoice);
9 TextView tv3 = (TextView)findViewById(R.id.textView_result);
10 }

Wie kann ich aus den Textviews innerhalb der onCreate Methode Klassenvariablen machen?

MfG Gunne

[EDIT]
Hat sich erledigt. Ich hab allen Ernstes vergessen, die Variablen außerhalb der Methode zu deklarieren... sorry.

— geändert am 14.12.2013, 01:42:49

Antworten
Barbaric Chicken
  • Forum-Beiträge: 66

16.12.2013, 09:42:06 via Website

Christian Hempe
Hi Gunne,

noch ein kleiner Tipp am Rande.

Die Methode findViewById solltest du in die oncreate-Methode deiner Activity verlagern und die beiden TextViews als Klassenvariablen deklarieren.
Dann muss nicht bei jedem Button-Klick die Layout-XML nach den beiden TextViews durchsucht werden.

Mfg Christian

Hallo,

dazu muss ich jetzt doch mal fragen.

Ich habe mir das mal genau anders erklären lassen. Da hieß es:
Da wir auf mobilen Geräten (noch) mit wenig Speicher zu kämpfen haben, wäre es sinnvoller die Elemente in den einzelnen Methoden neu zu suchen und in den Methoden jeweils nur zu halten. So würden die Objekte direkt am Ende der Methode vom GC eingesammelt und verschwinden aus dem Speicher.
Anders bleiben die so lange bis die activity zerstört wird im Speicher und das ja auch zu Zeiten, wo sie eventuell gar nicht benötigt werden.

Was ist also nun der bessere Weg? Die Suche nach den Elementen über getViewById ist ja auch alles andere als Zeit intensiv, einen Geschwindigkeitsbonus kann ich jedenfalls nicht feststellen.

Viele Grüße

Antworten
impjor
  • Forum-Beiträge: 1.793

19.12.2013, 21:45:43 via App

Das finde ich eine interessante Frage:
Ich denke, dass schon ein Geschwindigkeitsvorteil vorliegt (ob messbar k.A.): 1. Braucht jeder Methodenaufruf Zeit und findViewById muss auch mehr arbeiten je größer das Layout ist.
2. Der Aufruf des GC kostet auch mehrere ms.

Desweiteren ist eine Referenz ja nur 32Bit (4 Byte) groß. Ich glaube nicht, dass selbst ältere Handys damit Probleme bekommen.


Wäre schön, wenn andere hier noch ihre Meinung posten könnten!

LG

Liebe Grüße impjor.

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

Antworten
Barbaric Chicken
  • Forum-Beiträge: 66

20.12.2013, 08:56:04 via Website

impjor

2. Der Aufruf des GC kostet auch mehrere ms.

Am Ende der Methode wird der GC so oder so aufgerufen, oder nicht? Ich rufe Ihn ja nicht explizit auf. Das würde bedeuten die ms gehen eh verloren ob ich nun ein Objekt mehr oder weniger habe..?

impjor

Desweiteren ist eine Referenz ja nur 32Bit (4 Byte) groß. Ich glaube nicht, dass selbst ältere Handys damit Probleme bekommen.

Ist dem so? Immer 32 Bit? Ich meine z.B. ein EditText hat ja wiederum viele Referenzen auf andere Dinge.

impjor

Wäre schön, wenn andere hier noch ihre Meinung posten könnten!

Oh ja, das wäre es^^

Viele Grüße

Antworten
Gunne
  • Forum-Beiträge: 7

20.12.2013, 10:12:50 via Website

Mein Projekt ist mitlerweile zu meiner Zufriedenheit fertig gestellt. Ich danke allen, die geholfen haben. :)
Aus Übersichtsgründen würde ich den Thread dann jetzt auf beantwortet setzen und euch bitten, einen neuen zu öffnen, falls euch die im Raum stehende Frage interessiert.

MfG Gunne

— geändert am 20.12.2013, 10:50:36

Antworten