OnClick() funktioniert nur einmal?

  • Antworten:6
superSharp
  • Forum-Beiträge: 89

19.10.2013, 23:41:36 via Website

Guten Abend Android Coder,

für die ersten Schritte programmiere ich gerade eine App, die beim Drücken auf einen Button in einem Textfeld die aktuelle Uhrzeit ausgibt. Das funktioniert auch soweit, allerdings nur beim ersten Klick auf den Button, beim zweiten wird das neue Datum nicht neu reingeschrieben. Woran könnte das liegen?

Folgender Code:

1package com.example.androidapptest;
2
3import android.os.Bundle;
4import android.app.Activity;
5import android.view.Menu;
6import android.view.View;
7import android.widget.Button;
8import android.widget.TextView;
9import java.util.Calendar;
10
11public class MainActivity extends Activity {
12
13 @Override
14 protected void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.activity_main);
17
18 Button button1;
19 final TextView textView1;
20 final Calendar cal = Calendar.getInstance();
21
22 button1 = (Button)findViewById(R.id.button1);
23 textView1 = (TextView)findViewById(R.id.textView1);
24
25
26 button1.setOnClickListener(new View.OnClickListener()
27 {
28
29 @Override
30 public void onClick(View v)
31 {
32 textView1.setText(cal.getTime().toString());
33 }
34 });
35 }
36
37 @Override
38 public boolean onCreateOptionsMenu(Menu menu) {
39 // Inflate the menu; this adds items to the action bar if it is present.
40 getMenuInflater().inflate(R.menu.main, menu);
41 return true;
42 }
43
44}

Dann noch eine Frage:

Wenn ich eine Main-Methode erstellen will um darin den Code zu speichern, bekomme ich beim Casten des Buttons und der TextView den Fehler:

Cannot make a static reference to the non static method findViewById

Mit folgendem Code:

1package com.example.androidapptest;
2
3import android.os.Bundle;
4import android.app.Activity;
5import android.view.Menu;
6import android.view.View;
7import android.widget.Button;
8import android.widget.TextView;
9import java.util.Calendar;
10
11public class MainActivity extends Activity {
12
13 @Override
14 protected void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.activity_main);
17
18 }
19
20 @Override
21 public boolean onCreateOptionsMenu(Menu menu) {
22 // Inflate the menu; this adds items to the action bar if it is present.
23 getMenuInflater().inflate(R.menu.main, menu);
24 return true;
25 }
26
27 public static void main(String[] args)
28 {
29 final Button button1;
30 button1 = (Button)findViewById(R.id.button1);
31 TextView textView1 = (TextView)findViewById(R.id.textView1);
32
33 Calendar cal = Calendar.getInstance();
34
35 button1.setOnClickListener(new View.OnClickListener()
36 {
37
38 @Override
39 public void onClick(View v)
40 {
41 textView1.setText(cal.getTime().toString());
42 }
43 });
44 }
45
46}

Ich hätte das halt gerne etwas geordnet und nicht alles in der onCreate() Mehode.

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

20.10.2013, 00:15:19 via Website

beim zweiten wird das neue Datum nicht neu reingeschrieben

Doch, wird es, du siehst das nur nicht weil du immer den gleichen Wert hinein schreibst.


Wenn ich eine Main-Methode erstellen will

Selbst wenn du das "richtig" aufgeschrieben hättest, würde das nicht funktionieren, weil die Methode nirgends aufgerufen wird;
das klassische "main()" Konzept gibts bei Android nicht.

Antworten
Christian
  • Forum-Beiträge: 307

20.10.2013, 00:19:36 via Website

Hi superSharp,


Wenn ich eine Main-Methode erstellen will um darin den Code zu speichern, bekomme ich beim Casten des Buttons und der TextView den Fehler:
Nur um das klar zustellen diese Main-Methode (public static void main(String[] args) wie man Sie aus normalen Java Programmen kennt gibt es in Android nicht.

Ich hätte das halt gerne etwas geordnet und nicht alles in der onCreate() Mehode.
mmhh also du kannst schon das ganze "findViewById -Ding" in extra Funktionen auslagern aber sie sollten dann aus der onCreate aufgerufen werden. Stichwort: Activity Lifecycle

Mfg Christian Hempe

Antworten
superSharp
  • Forum-Beiträge: 89

20.10.2013, 00:38:17 via Website

Doch, wird es, du siehst das nur nicht weil du immer den gleichen Wert hinein schreibst.

Achsoo, danke :)

Selbst wenn du das "richtig" aufgeschrieben hättest, würde das nicht funktionieren, weil die Methode nirgends aufgerufen wird;
das klassische "main()" Konzept gibts bei Android nicht.

Danke, gut zu wissen :)

Edit: Anscheinend werden automatisch Events erstellt wenn man im Designer die Objekte eng zusammenschiebt. Ich hab einen ToggleButton hinzugefügt und den unter den normalen Button gezogen, jetzt wird das Datum nicht mehr in das Textfeld geschrieben sondern in den Button...Der Quellcode ist aber der gleiche...Zudem verschieben sich die beiden Buttons wenn ich das Textfeld bewege und der ToggleButton wird kleiner sobald ich den normalen Button verkleinere...
Oberfläche:

— geändert am 20.10.2013, 00:45:31

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

20.10.2013, 11:07:12 via Website


Doch, wird es, du siehst das nur nicht weil du immer den gleichen Wert hinein schreibst.

Achsoo, danke :)

Demnach hast du herausgefunden, was das eigentliche Problem war?

Anscheinend werden automatisch Events erstellt wenn man im Designer die Objekte eng zusammenschiebt.

Deiner Beschreibung entnehme ich, das die "Beziehungen zwischen den Views" meinst :bashful:
...und die Frage wäre?

Antworten
superSharp
  • Forum-Beiträge: 89

20.10.2013, 12:03:18 via Website

Demnach hast du herausgefunden, was das eigentliche Problem war?

Ja, ich muss die neue Insance im Button Event erstellen.

Deiner Beschreibung entnehme ich, das die "Beziehungen zwischen den Views" meinst :bashful:
...und die Frage wäre?

Wie ich das wieder weg bekomme ^^

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

20.10.2013, 13:41:59 via Website

Wie das direkt im Designer geht, kann ich dir nicht sagen, da ich den nur zur Kontrolle benutze.

Unter der Ansicht kannst du auf die .xml Darstellung umschalten, und da wirst du dann bei den Views die Referenzen auf andere Views sehen (layout_below, layout_toRightOf etc) und kannst da dann löschen, was an "Verbindungen" unerwünscht ist.

Antworten