Alternative zu ToggleButton (Android/Java)

kaoZ

Top Contributor
Hallöchen freunde der Programmierung 🙂

Ich bin mal wieder auf ein kleines Problem gestoßen , ich würde gerne einen Button erzeugen der beim ersten klick eine Methode aufruft, den Button Text ändert einen Aktion durchführt und darauf beim 2ten Klick eine andere aktion durchführt, hier zu meinem Problem:

Java:
public final class Test extends Activity implements OnClickListener 
{
    private Button btnSwitch;
    private EditText textField;

public void onCreate(Bundle SavedInstanceState)
{
super.onCreate(SavedInstanceState);
setContentView(R.layout.test_layout);

  btnSwitch = (Button)findViewById(R.id.btnswitch);
  btnSwitch.setOnClickListener(this);

  textField = (EditText)findViewById(R.id.textfield);
}
public void onClick(View v)
{
  switch(v.getId())
  {
    case R.id.btnswitch:
        btnswitch.setText("Geänderter Text");
        methodeEins();
    break;
  }

if(textField.getText()=="Beispiel")
{
  methodeZwei();
}
} // onClick Ende

public void methodeEins()
{
  textField.setText("Beispiel");
}

public void methodeZwei()
{
  textField.setText("");
}
} // class Ende

mein Problem ist das er beim Klick , die switch anweisung befolgt, diese durchläuft die methodeEins ausführt und nach dem break; direkt weiter in die IF schleife geht und dann ja schon die Anforderungen erfüllt und mir die den Inhalt der EditTextfelder gleich wieder löscht :lol:..... selbst wenn ich noch zusätzlich einen Int wert setze und diesen über die Methode ändere, oder die If anweisung vor die switch Anweisung setzte ( was dann garnichtmehr funktioniert) funktioniert es nicht , gibt es keine möglichkeit diese Aktionen mit einem Normalen Button durchzuführen (ggf. die onClick mehtode nicht anhand der Id du identifizieren??!!) , oder muss man dafür zwingend auf ToggleButton zurückgreifen ?
 
Du könntest bei edem Klick einen Wert hochzählen und dann zwei if-Anweisungen machen. Die eine greift, wenn, bei einer Division durch zwei, ein Rest vorhanden ist und die andere greift, wenn das nicht der Fall ist.

Gruß
Gucky
 
ich hatte schon versucht es über einen Int wert der beim ersten aufrufen der methode auf auf 1 gesetzt wird zu regeln allerdings führt das aufrufen der switch schleife dazu das trotzdem die if anweisung danach aufgerufen wird, sonst müsste man es ohne die switch anweisung regeln oder ? bzw ohne die id als identifier ?!
 
ToggleButtons werden eigentlich auch dazu verwendet, um für die Dauer der Altivierung etwas bestimmtes zu tun.

Das die If-Anweisung aufgerufen wird, kommt daher, dass die Methode nicht "beendest" mit dem break sondern nur die switch anweisung. Wenn du aus der Methode herausspringen willst, müsstest du entweder das break mit einem return vertauschen oder die If-Anweisung mit in einen switch case tun.

Außerdem dürfte die erste If-Anweisung nie true ergeben, weil Strings nicht mit dem Binärvergleichsoperator == verglichen werden sondern mit .equals(String str) .
 
könntest du ein beispiel nennen wie ich eine if anweisung in einer switch case anweisung die sich auf die ID bezieht realisieren kann ?

weil 2 x die id des buttons angeben kann ich ja nicht .

Java:
public void onClick(View v) {

	
		switch(v.getId())
		{
		case R.id.btnswitch:
			btnSwitch.setText("Felder Löschen");
			methodeEins();
			return; // <<---- anstelle des break; springt jetzt aus der switch anweisung ?!
		} 
	
	}
 
Du müsstest einfach die switch Anweisung um einen case erweitern, der den anderen Status der ID behandelt. Ich muss leider gestehen, dass ich nicht weiß, was in so einer ID drin steht oder welche unterschiedlichen Werte sie annehmen kann.

Aber btw werden switch cases eigentlich verwendet, um eben keine If-Anweisung zu benutzen.

Das return kannst du anstelle der if-Anweisung im switch case verwenden. Wenn jetzt die Bedingung des switch cases erfüllt ist, dann wird die if-Anweisung nicht mehr überprüft.

PS: für einen einzigen case nimmt man eigentlich kein switch.
 
die Id dient als eindeutiger Identifier für ein Objekt, demnach ist der Button an diese Id gebunden und nimmt somit keinen anderen Status an als diesen .

im prinzip müsste ich wissen wie ich es realisieren kann die onClick methode auf den Button anzuwenden, der daraufhin seinen Status ändert ( text / zuweisungs einer Int variable ) eine methode ausführt, und auf erneuten klick auf den gleichen Button ( mit der gleichen Id) eine andere methode ausführt, wenn ich es aber versuche es über die id zu regeln wird immer der gleiche einstiegspunkt gewählt , nämlich der mit der eindeutig zugewiesenen Id.

gibt es eine andere möglichkeit den buttonklick / bzw. den 2ten klick parallel zu der id des buttons zu behandeln ?

würde halt ungern nen extra button einfügen , hab auch schon versucht die editText felder mit einem onFocus wieder in einen leeren zustand zu versetzen , allerdings ist das nicht das was ich möchte , es sollen halt mehrere felder geleert werden über den button der auch die felder zusammenrechnet, nur halt beim 2ten klick .

jemand eine idee ?
 
Die ID könntest du speichern als die ID des Buttons in einer separaten Variable. Immer wenn du die Methode onClick mit dieser ID aufrufst, wird der int einen hochgezählt und der Rest einer Division durch 2 bestimmt. Jenachdem, welcher Rest vorhanden ist, wird die passende Methode ausgeführt (,wofür der switch eher geeignet ist).

Aber es gibt eine viel einfachere Lösung:
Du tust das hochzählen und den switch case in den Actionlisteners eines stinknormalen (j)Buttons. Mkt jedem Klick wird der int einen hochgezählt und es wird der switch case durchlaufen. Jenachdem, welcher Rest vorhanden ist, wird der richtige switch case und folglich auch die richtige Methode aufgerufen.

Deine Lösung zeugt von einem hohen Verständnis von Java, welches dich aber die leichten Lösungen übersehen lässt 😀 (geht mir aber teilweise genauso 😉 )
 
Das Problem ist das ich die Id nicht einfach in einer Variablen speichern kann ( ich kann zwar die Referenz/variable die auf diese Id verweist speichern, aber nicht die id selbst) da sie keinen Typ besitzt,

funktionieren würde sowas hier ( glaube ich ) :

Java:
private int btnSwitcher = 0;
private Button btnEins;

public void onClick(View v)
{
  if(btnEins.isPressed())
{
  btnSwitcher++; // würde dann bei jedem klick um einen erhöhen
}

}
und dann müsste ich noch eine anweisung erstellen die die Int's aus der variable btnSwitcher behandelt und dementsprechend die methoden aufruft, allerdings hab ich noch keinen schimmer wie ich es handhaben soll ^^😛opcorn:

meintest du sowas in der art? manchmal hab ich das gefühl ich mach es mir komplizierter als es ist, aber ich steh halt noch so ziemlich am anfang was die Android programmierung betrifft^^
 
Zuletzt bearbeitet:
so funktioniert es 🙂

Java:
@Override
public void onClick(View v)
{
		
  if(btnEins.isPressed())
  {
     btnSwitcher++;
   }
if(btnSwitcher == 1)
  {
     rechnen();
     CharSequence leer = this.getResources().getString(R.string.btnFelderLeeren);
     btnEins.setText(leer);	
		}
if(btnSwitcher == 2)
  {
     CharSequence berechnen = this.getResources().getString(R.string.btnKalorienRechnen);
     btnEins.setText(berechnen);
     textField.setText("");
     btnSwitcher = 0;
   }

}

ob das jetzt die schönste lösung ist wage ich allerdings zu bezweifeln ^^ noch jemand ne idee wie man es in einem ordentlicheren Code verpacken könnte ?
 
Zuletzt bearbeitet:
Deine Lösung funktioniert nur bis man das dritte mal klickt. Der Restoperator ist der hier --> % aber sonst sieht sie gut aus.

Aber eine Sache frage ich mich noch: hat dein Button keinen Actionlistener?
 
Hab den code komplett fertig, ich setze jetzt einfach die variable btnSwitch nach der zweiten Ausführung wieder auf 0, so funktioniert es auch nach dem 3ten mal 🙂 klappt bestens, der actionListener ist dem Fall der onClickListener der dir onClick Methode aufruft, die wiederum jetzt dem counter hochzählt , wenn ich nachher am Rechner bin Poste ich nochmal den vollständigen code.
 

Zurück
Oben