Text onClick Button

  • 31 Antworten
  • Letztes Antwortdatum
Feelix333

Feelix333

Stamm-User
349
Hallo zusammen,

Ich bin ein Anfänger in der Android App Programmierung.

Ich möchte einen Button bauen, bei dem auf einem klick darauf ein Text - also eine Meldung angezeigt wird. Immer die selbe eben.

Ich habe schon viel gesucht aber nichts passendes gefunden.

Hier mein Code:

activity_main.xml:
Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_centerHorizontal="true"
        android:text="@string/text" />
    
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/button1"
        android:onClick="klick1" />
</RelativeLayout>

MainAcivity.java:
Code:
package com.example.test;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	private Button button1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button1 = (Button)findViewById(R.id.button1);
		button1.setOnClickListener(this);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public void onClick(View arg0) {
	//	if (button1)
	//	{
	//		String greeting = getResources().getString(resourceId, name);
	//		Toast.makeText(this, greeting, Toast.LENGTH_LONG).show();
	//	}
		
	}
	

}

Leider klappt das nicht.
Den Button und darüber einen Text bekomme ich schon angezeigt.
Allerdings weiß ich nicht, wie ich das machen soll, das bei einem Klick eine Message angezeigt wird.

Habe mich jetzt zum Schluss total vertan (wie man an dem auskommentiertem sieht).

Hoffe ihr könnt mir schnell weiterhelfen.
Macht mir echt Spaß, aber jetzt bin ich dann frustriert.. :-/

mfg
felix
 
Hi,

ich denke mal dein Problem liegt an dem Teil:
Code:
String greeting = getResources().getString(resourceId, name);
Ich würde an deiner Stelle noch nicht mit Resources arbeiten.
Du bist noch anfänger. Da sollte man erstmal statisch anfangen.

Einfach wäre es also, dass du diese Zeile auskommentiert lässt und beim
den zweiten parameter mit
füllst.

Gruß
 
  • Danke
Reaktionen: Feelix333
IceClaw schrieb:
Hi,

ich denke mal dein Problem liegt an dem Teil:
Code:
String greeting = getResources().getString(resourceId, name);
Ich würde an deiner Stelle noch nicht mit Resources arbeiten.
Du bist noch anfänger. Da sollte man erstmal statisch anfangen.

Einfach wäre es also, dass du diese Zeile auskommentiert lässt und beim

den zweiten parameter mit

füllst.

Gruß

Hey, danke schon mal.
Also muss es so heißen?

Code:
public void onClick(View arg0) {
		if (button1)
		{
			Toast.makeText(this, greeting, Toast.LENGTH_LONG).show("Hello World");
		}
		
	}

Dann bekomme ich bei "button1" die Meldung "cannot convert from button to boolean" und bei "greeting" die Meldung "greeting cannot be resolved to a variable".
 
Zuletzt bearbeitet:
Code:
"cannot convert from button to boolean
Richtig.
Denn bei if() muss immer ein "Ja" oder "Nein" raus kommen. Was eben genau ein boolean-wert ist.

In Programmiersprachen kann man das dann quasi abfragen mit
if(booleanWert) (Wenn eine Variable booleanWert = true; gesetzt ist)
oder man fragt, wie man es auch auf deutsch machen würde, "Ist dieser wert GLEICH das?".
Das wird meistens so realisiert:
if(button1 == wasAuchImmer).
Man fragt hier also "Ist der Button GLEICH wasAuchImmer?". heraus kommt "ja" oder "nein".

So, wieder zu deinem problem.
Du machst das ganze "doppelt".
ENTWEDER du sagt in deiner XML-Datei:
Dann musst du in deinem Code eine methode haben die so heißt.
Dann musst du NICHT mit dem ClickListener arbeiten.

ODER du machst es wie dein quelltext. Dann muss das "onClick=""" aber in deiner XML raus.
Im Quelltext-If musst dann das hier abfragen
Code:
 b1.getId() == ((Button)v).getId()

Gruß
 
  • Danke
Reaktionen: Feelix333
IceClaw schrieb:
Code:
"cannot convert from button to boolean
Richtig.
Denn bei if() muss immer ein "Ja" oder "Nein" raus kommen. Was eben genau ein boolean-wert ist.

In Programmiersprachen kann man das dann quasi abfragen mit oder man fragt, wie man es auch auf deutsch machen würde, "Ist dieser wert GLEICH das?".
Das wird meistens so realisiert:

Man fragt hier also "Ist der Button GLEICH wasAuchImmer?". heraus kommt "ja" oder "nein".
- Ah, alles klar - danke für die Erklärung!

IceClaw schrieb:
So, wieder zu deinem problem.
Du machst das ganze "doppelt".
ENTWEDER du sagt in deiner XML-Datei:

Dann musst du in deinem Code eine methode haben die so heißt.
Dann musst du NICHT mit dem ClickListener arbeiten.

ODER du machst es wie dein quelltext. Dann muss das "onClick=""" aber in deiner XML raus.
Im Quelltext-If musst dann das hier abfragen
Code:
 b1.getId() == ((Button)v).getId()

Gruß
Ich glaube die zweite Methode ist schlauer - so wollte ich es denke ich auch machen.
Das "onClick..." habe ich schon gleich aus der XML rausgeschmissen.

Wie muss ich das dann im Quelltext abfragen?
Ich habe es jetzt so:

Code:
@Override
	public void onClick(View arg0) {
		if (button1.getId() == ((Button)v).getId())
		{
			Toast.makeText(this, greeting, Toast.LENGTH_LONG).show("Hello World");
		}
		
	}

Das "v" kennt es nicht und deshalb kommt cannot resolved to a variable - und der Fehler bei "greeting" ist wie oben Beschrieben auch noch da.


Vielen Dank!
mfg
Felix
 
Zuletzt bearbeitet:
Code:
Das "v" kennt es nicht und deshalb kommt cannot resolved to a variable - und der Fehler bei "greeting" ist wie oben Beschrieben auch noch da.
Das "v" stellt in dem fall das Objekt "View" wieder.
Wo findet man dies bei dir? Richtig, schau mal was die Methode dir standardmäßig mitgibt ;)

das "greeting", also deine error medlung, solltest du auch in etwas statisches "umwandeln".
Zum Beispiel in "Ich wurde geklickt".

Gruß
 
  • Danke
Reaktionen: Feelix333
Ah, okay - stimmt steht drüber :p
Code:
public void onClick(View arg0) {
		if (button1.getId() == ((Button)arg0).getId())
		{
			Toast.makeText(this, greeting, Toast.LENGTH_LONG).show("FELIX");
		}
		
	}
Wie kann ich "greeting" in etwas statisches umwandeln?
Sorry für die dumme Frage :unsure:

Einfach nur
Code:
Toast.makeText(this,"Ich wurde geklickt", Toast.LENGTH_LONG).show("FELIX");
Das stimmt aber nicht.

Der ursprüngliche Beitrag von 15:30 Uhr wurde um 15:44 Uhr ergänzt:

Ah habs! :) :)

Code:
public void onClick(View arg0) {
		if (button1.getId() == ((Button)arg0).getId())
		{
			Toast.makeText(this, "Ich wurde geklickt", Toast.LENGTH_LONG).show();
		}
		
	}
 
Zuletzt bearbeitet:
Hallo,

Eine kurze Frage für die ich nicht extra einen neuen Thread aufmachen will:

Was bringt das "&s!" bei der Value "Hi &s!" im String "hi_greeting"?

mfg
Felix
 
Ich weiß jetzt nicht wovon du redest ...
 
Oh Sorry, das hier ist ja umgewandelte Version mit einem Button :blushing: :unsure:
Ich rede von dieser App.
Dort wird eine App gebaut mit zwei Buttons, die auf Klick den eingegeben Namen + Hi oder Hello per Toast ausgeben.

mfg
felix
 
Hi,

naja dieser Screenshot sollte eig. alles erklären:
Beginners_Workshop_AppReady3.png

Er zeigt also den String von der strings.xml an + den Namen.

Wie macht er das?
Das hier steht in der strings.xml
Code:
<string name="hi_greeting">Hi %s!</string>
Im Code dann:
Code:
EditText nameField = (EditText) findViewById(R.id.name_field);
String [COLOR="Red"]name[/COLOR] = nameField.getText().toString();
Später..
Code:
String greeting = getResources().getString(resourceId, [COLOR="red"]name[/COLOR]);
Toast.makeText(this, greeting, Toast.LENGTH_LONG).show();

Er füllt quasi die Variable %s mit einem Wert. In dem fall mit dem wert name, der den Inhalt vom EditText hat...

Gruß
 
  • Danke
Reaktionen: Feelix333
Ist "%s" also immer die Variable?
Weil "%s" ja vorher nicht irgendwo explizit definiert wurde.

Vielen Dank übrigens wieder für deine Top Erklärungen! :thumbup:
 
Hier ist eine relativ gute Erklärung.

Ist zwar nicht genau das, was du suchst, aber dort wird genau drauf eingegangen was %s ist und warum man manchmal auch %c, %o oder %S benutzen sollte...

Gruß
 
  • Danke
Reaktionen: Feelix333
Ah, okay jetzt hab ichs verstanden. :)
s -- String -- format("%s %s", "hello", "Hello"); -- hello Hello

Noch eine Frage:
(Hoffe du bist nicht langsam genervt von mir ;-) )

Von der App mit den 2 Buttons ist der Code:
Code:
int resourceId = v == hiButton ? R.string.hi_greeting
		            : R.string.hello_greeting;

Diesen habe ich für eine App mit einem umgewandelt in:
Code:
int resourceId = arg0 == button1 ? R.string.response
					: R.string.response;

Da es dort nur einen Button gibt, habe ich einfach mal beide gleich benannt.
So ist natürlich nicht richtig.

Wie muss es heißen, wenn es nur einen Button und damit auch nur ein greeting/response gibt der bei TextView ausgegeben werden soll?




Vielen Dank!

mfg
Felix
 
Du bist Anfänger hä?! :D
Auch im generellen programmieren?! Merkt man ;)

Also:
Was bedeutet das eigentlich?
Code:
int resourceId = v == hiButton ? R.string.hi_greeting
		            : R.string.hello_greeting;
Das ist eine andere Schreibweise für
Code:
int resourceId;
if(v == hiButton) {
   resourceId = R.string.hi_greeting;
} else {
   resourceId = R.string.hello_greeting;
}
Denke jetzt sollte es klarer sein?

Falls nicht:
Du brauchst das für einen Button doch gar nicht. Da gibts keine Fallunterscheidung. resourceId ist bei dir immer R.string.response. Von daher kannst du dir diese abfrage auch sparen.

Gruß
 
  • Danke
Reaktionen: Feelix333
IceClaw schrieb:
Du bist Anfänger hä?! :D
Auch im generellen programmieren?! Merkt man ;)
Ja und Ja :D Sorry :blushing:

IceClaw schrieb:
Also:
Was bedeutet das eigentlich?
Code:
int resourceId = v == hiButton ? R.string.hi_greeting
		            : R.string.hello_greeting;
Das ist eine andere Schreibweise für
Code:
int resourceId;
if(v == hiButton) {
   resourceId = R.string.hi_greeting;
} else {
   resourceId = R.string.hello_greeting;
}
Denke jetzt sollte es klarer sein?

Falls nicht:
Du brauchst das für einen Button doch gar nicht. Da gibts keine Fallunterscheidung. resourceId ist bei dir immer R.string.response. Von daher kannst du dir diese abfrage auch sparen.

Gruß
Ja, jetzt ist es klarer :)
Da ich nur einen Button habe ist kein Else nötig.
Code:
int resourceId;
if (arg0 ==button1)
{
   resourceId = R.string.response;
}

Wiedermal Danke für schnelle und gute Antwort!!
 
Hallo zusammen,

Ich wollte nicht extra einen neuen Thread eröffnen, da mein aktuelles Problem mit einer ähnlichen App zu tun hat:

Ich habe eine App erstellt, die bei Klick auf einen Button einen Sound abspielt.

War nicht schwer, hat einwandfrei funktioniert.
Allerdings dauert der Sound ca. 20 Sekunden und wenn man die App verlässt ertönt der Sound trotzdem hin Hintergrund weiter.

Deshalb habe ich meine App ergänzt um:
1. Einen Stop-Button zum pausieren des Sounds.
2. Eine Methode die den Sound stoppt sobald man die App verlässt.

Funktioniert ebenfalls.

Aber die App wird beendet wenn:
1. Der Stop-Button gedrückt wird ohne das der Sound läuft.
2. Die App verlassen wird ohne etwas getan zu haben.

Ich habe jetzt schon lange gesucht aber leider keine Lösung gefunden, könnt ihr mir helfen?

Vielen Dank!


Code:
package com.example.weekend;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
import android.view.View.OnClickListener;

public class MainActivity extends Activity
{

	public MediaPlayer mp;  
    Button play;
    Button stop;
    
    public void onCreate(Bundle savedInstanceState)
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        play = (Button) findViewById(R.id.button);
        stop = (Button) findViewById(R.id.stop);
  
        play.setOnClickListener(new OnClickListener()
        {  
  
            public void onClick(View v)
            {  
                mp = MediaPlayer.create(getApplicationContext(), R.raw.applaus);  
                mp.start();
            }
        }
        );
        
        stop.setOnClickListener(new OnClickListener()
        {
        	public void onClick(View w)
        	{
        		mp.stop();
        	}
        }
        );
  
    }
    
    public void onDestroy()
    {
    	super.onDestroy();
    	mp.stop();
    }
    
}
 
Zuletzt bearbeitet:
Zu 1:
Ich öffne Deine App und drücke Stop... Kannst Du mir sagen, welches Objekt dann noch nicht existiert?

Eine Lösung wäre es, eine Deiner Zeilen aus dem ClickEvent für Play in die onCreate-Methode auszulagern.

Weisst Du, worauf ich hinaus will?

Zu 2.
Das sagt mir nicht so viel. Was stört Dich daran? Dass die App nicht als Task läuft oder was? Bitte erläutern.

Beste Grüße,
Thomas
 
  • Danke
Reaktionen: Feelix333
1.) Das Start Objekt?
Als einfach "mp.start();" vor "mp.stop();"?

EDIT: Funktioniert leider nicht so einfach. :-/

2.) Was mich daran stört??
Das die App abstürt wenn man sie nur öffnet und wieder schließt ohne einen Button angeklickt zu haben?
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben Unten