ImageButton soll nach jedem Klick das Bild ändern

  • 17 Antworten
  • Letztes Antwortdatum
A

androci

Neues Mitglied
0
Hallo Leute,

habe folgendes Problem:
Ich habe in meine App ein ImageButton implementiert. Beim klick darauf, soll sich Bild1 in Bild2 ändern. Das funktioniert soweit. Allerding sollte sich beim erneuten klick darauf, Bild2 wieder in Bild1 umstellen. Da hadert es leider :( ...was mache ich falsch?

hier mein Code dazu:
Code:
.
.
ImageButton lb;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        lb=(ImageButton) findViewById(R.id.lautsprecher_ImageButton);
        lb.setOnClickListener(this);

}

        @Override
        public void onClick(View v) {

            if (v==lb){
                
                //Bild ändern beim drauf drücken
                ImageButton lautsprecher = (ImageButton) findViewById(R.id.lautsprecher_ImageButton);
                lautsprecher.setImageResource(R.drawable.lautsprecher_stumm);
                //Meldung bringen
                Toast.makeText(MainActivity.this,"Stumm-Modus aktiviert!", Toast.LENGTH_SHORT).show();
                
            }
            
            if (v != lb){
                
                //Bild ändern beim drauf drücken
                ImageButton lautsprecherstumm = (ImageButton) findViewById(R.drawable.lautsprecher_stumm);
                lautsprecherstumm.setImageResource(R.id.lautsprecher_ImageButton);
                //Meldung bringen
                Toast.makeText(MainActivity.this,"Stumm-Modus deaktiviert!", Toast.LENGTH_SHORT).show();
            }      
            
        }
 
Ich vermute, dass es daran liegt, dass Du R.id mit R.drawable vertauscht hast. (?)
 
Code:
if (v != lb){
Das wird NIE aufgerufen... oder?!

Gruß
 
@toomuchcoffeeman

Bild2 befindet sich im drawable Ordner (deshalb R.drawable...). Bild1 habe ich mit einer id versehen, daher auch speziell eine id dafür. Aber für Bild2 würde ich auch gerne extra eine id vergeben, nur kann ich das nicht machen oder weiß nicht wie ich das anstellen soll :confused2:

@IceClaw

ich vermute auch, dass es daran liegt, dass...
Code:
if (v != lb){
...gar nicht aufgerufen wird. Auch wenn ich auf den ImageButton einmal geklickt habe und er sich auch von Bild1 auf Bild2 umstellt, wird nicht erkannt, dass Bild2 nun auf dem ImageButton ist! Habe es auch mit einer extra Variable für das Bild2 versucht, dann spuckt er mir allerdings den Fehler "Unfortunately..." aus :sad:
 
Was heisst "Du vermutest das auch" ? Kannst Du Dir keinen Breakpoint setzen und debuggen? Dann wird die Vermutung evtl zur Gewissheit
 
habs probiert mit dem debuggen. Also er springt überhaupt nicht in die Zeile. Was könnte das Problem sein? Im Code müsste normalerweise die folgende Zeile reichen:

Code:
lb=(ImageButton) findViewById(R.id.lautsprecher_ImageButton);
...damit sage ich ja, dass die Variable "lb" nur für die id "lautsprecher_ImageButton" steht! und wenn die id ungleich "lautsprecher_ImageButton", dann soll die andere if Anweisung durchgeführt werden! Wird leider nicht gemacht. ohh man, bin am verzweifeln :(
 
Da Du die Zuweisung für lb aber nicht änderst, kann auch immer nur die gleiche Anweisung abgespult werden

Das normale Vorgehen wäre wohl in der Art...

Code:
lb = a;

if (lb=a) {
  //mach was
  lb = b;
}
else if (lb = b) {
  //mach was
  lb = a;
}
Dann würdest Du das toggeln. Allerdings habe ich das noch nie mit Images für einen Button gemacht. Das Prinzip ist aber dasselbe.
 
ich habe das jetzt so versucht:

Code:
.
.
ImageButton lb;

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

@Override
        public void onClick(View v) {

            if (v == lb){
                
                //Bild ändern beim drauf drücken
                ImageButton lautsprecher = (ImageButton) findViewById(R.id.lautsprecher_ImageButton);
                lautsprecher.setImageResource(R.drawable.lautsprecher_stumm);
                //Meldung bringen
                Toast.makeText(MainActivity.this,"Stumm-Modus aktiviert!", Toast.LENGTH_SHORT).show();
                
               [B] lb=(ImageButton) findViewById(R.drawable.lautsprecher_stumm);[/B]
            }
            
            else if (v == lb){
                
                //Bild ändern beim drauf drücken
                ImageButton lautsprecherstumm = (ImageButton) findViewById(R.drawable.lautsprecher_stumm);
                lautsprecherstumm.setImageResource(R.id.lautsprecher_ImageButton);
                //Meldung bringen
                Toast.makeText(TabataActivity.this,"Stumm-Modus deaktiviert!", Toast.LENGTH_SHORT).show();
                
               [B] lb=(ImageButton) findViewById(R.id.lautsprecher_ImageButton);[/B]

            }
...allerdings hat mich das auch nicht weiter gebracht.
 
Ich kann dir ehrlich gesagt bei deinem Code nicht so ganz folgen, scheinen ein paar Denk/Anfängerfehler drinnen zu sein ;) Wenn du bis morgen nicht weiter gekommen bist schreib ich dir den Code, dann kannst du vergleichen was du anders gemacht hast. Mfg keinbrain
 
Also das kann so nicht stimmen:

Code:
if( v==lb ) { ... } else if( v==lb ) { ... }
 
Es kann auch nicht stimmen, dass geprüft wird, ob der ImageButton die View ist auf die geklickt wurde.
Es ist doch von Interesse, welches Bild aktuelle ist.

Ich würde mir ja eine boolesche Variable speakerOn erstellen und dann sowas ist in Art schreiben:
Code:
speakerOn=!speakerOn;
if (speakerOn){
    // BildRessource vom lautsprecher (ImageButton) entsprechend setzen
    }
else{
    // BildRessource vom lautsprecher (ImageButton) entsprechend setzen
    }
// evtl. view refreshen
 
@keinbrain: leider bin ich nach langer überlegung und tun und machen nicht vorwärts gekommen. Für mich ist meine bisherige Lösung irgendwie logisch, nur funktioniert sie nicht

@JanF: mit deinem Lösungsansatz kann ich leider nicht viel anfangen... muss auch zugeben, dass ich ein Anfänger bin :scared:

@DieGoldeneMitte:
nach dem die if Anweisung überprüft wurde, wird sie ja durchlaufen und die varaible lb mit der id "lautsprecher_ImageButton" ersetzt durch "drawable.lautsprecher_stumm" und in der else if Anweisung umgekehrt...
Ich stehe echt aufm Schlauch Leute :confused:
 
Wenn das erste "if" false ist, wird direkt zum "else" gesprungen - und dann wird das zweite "if" auch false sein, weil inzwischen weder v noch lb verändert haben können (für pro's: multithreading mal außen vor :D).

Und wenn das erste "if" true ist, kommt das "else" (und damit der zweite "if") garnicht zum Zuge.

Du kannst auch mit einem Debugger durchsteppen. Vielleicht geht dir dann ein Licht auf. :D
 
  • Danke
Reaktionen: androci
@DieGoldeneMitte:
...du hast recht, in das zweite "if" springt er nie, egal ob das erste "if" true oder false ist :sleep:
hmmm...
 
Wenn Du das so in Deinem Code stehen hast, wie zuletzt angegeben

Code:
if (v == lb) {
} else if (v == lb) {
}
kann das auch nicht sein, weil beide Bedingungen gleich sind. Somit geht er entweder in die erste Bedingung oder in gar keine.

Hier sind schon etliche Kommentare gefallen, was Du falsch mchst und wie man es machen könnte.

Ich denke, Du solltest Dich auf elemtarer Ebene mit if-Anweisungen und weiterführend damit beschäftigen, wie man damit toggelt.

Als Klassenmember:
Code:
private boolean sound = TRUE;
als OnClick-Methode:
Code:
sound = !sound;
Diese Anweisung führt dazu, dass falls sound vorher TRUE ist, sound auf FALSE gesetzt wird. Bei jedem Klick toggelst Du also den Wahrheitsgehalt der booleschen Variable sound.

Dann die if-Anweisung::
Code:
if (sound) {
  //sound war VORHER (!) FALSE -> hier als sound anschalten und das richtige Image auswählen
} else {
  //sound war VORHER (!) TRUE -> hier sound aus und richtiges Image setzen
}
Debugger nutzen, um zu schauen, ob das Toggeln klappt.

Gruß,
Thomas
 
  • Danke
Reaktionen: androci
Hi Thomas, erst einmal danke für deine Geduld. die if-else Anweisung funktioniert jetzt soweit :thumbsup:
...allerdings habe ich jetzt das Problem, dass das Bild nicht mehr zurück geswitcht wird und sogar die App abstürzt, wenn der Code folgendermassen aussieht:

Code:
if (sound){
                
                //Bild ändern beim drauf drücken
                ImageButton lautsprecher = (ImageButton) findViewById(R.id.lautsprecher_ImageButton);
                lautsprecher.setImageResource(R.drawable.lautsprecher_stumm);
                //Meldung bringen
                Toast.makeText(TabataActivity.this,"Stumm-Modus aktiviert!", Toast.LENGTH_SHORT).show();
            }
            
            else{
                
                //Bild ändern beim drauf drücken
                ImageButton lautsprecherstumm = (ImageButton) findViewById(R.drawable.lautsprecher_stumm);
                lautsprecherstumm.setImageResource(R.id.lautsprecher_ImageButton);
                //Meldung bringen
                Toast.makeText(TabataActivity.this,"Stumm-Modus deaktiviert!", Toast.LENGTH_SHORT).show();
                
            }
...wenn ich vom "else" Zweig folgende rotmarkierten Zeilen rausnehme, dann gibt es den Absturz nicht! Aber ich will ja beim zweiten Klick, wieder das Ausgangsbild auf meinem ImagButton.

Code:
else{
                
                //Bild ändern beim drauf drücken
                [COLOR=Red][B]ImageButton lautsprecherstumm = (ImageButton) findViewById(R.drawable.lautsprecher_stumm);[/B][/COLOR]
                [COLOR=Red][B]lautsprecherstumm.setImageResource(R.id.lautsprecher_ImageButton);[/B][/COLOR]
                //Meldung bringen
                Toast.makeText(TabataActivity.this,"Stumm-Modus deaktiviert!", Toast.LENGTH_SHORT).show();
                
            }
 
Der Imagebutton behählt ja die gleiche ID. R.drawable.lautsprecher_stumm ist nahezu sicher kein Imagebutton. (Ich bin nicht ganz sicher, ob die id der View zufällig gleich der einer drawable Ressource sein kann, gehe aber davon aus, dass nicht).

Kuck Dir mit dem Wissen deinen rot markierten Code nochmal an und überlege, was Du ändern solltest.
 
  • Danke
Reaktionen: androci
das Problem ist ja das zweite Bild, dass ich im "drawable" Ordner hinterlegt habe. Dem kann ich keine id vergeben, nur das erste Bild hat die id "lautsprecher_ImageButton"
so sieht es in der .xml Datei aus:

Code:
<ImageButton
        android:id="@+id/lautsprecher_ImageButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/vorbereiten_TextView"
        android:layout_alignParentTop="true"
        android:src="@drawable/lautsprecher_laut" />
...da wird mir die Warnung eingeblendet: -> [Accessibility] Missing contentDescription attribute on
image

aber das ist ja halb so schlimm

Der ursprüngliche Beitrag von 12:17 Uhr wurde um 13:56 Uhr ergänzt:

ok, habs nun :thumbsup:
folgendes habe ich nun geändert:

Code:
if (sound){
                
                //Bild ändern beim drauf drücken
                ImageButton lautsprecher = (ImageButton) findViewById(R.id.lautsprecher_ImageButton);
                lautsprecher.setImageResource(R.drawable.lautsprecher_stumm);
                //Meldung bringen
                Toast.makeText(MainActivity.this,"Stumm-Modus aktiviert!", Toast.LENGTH_SHORT).show();
            }
            
            else{
                
                //Bild ändern beim drauf drücken
                ImageButton lautsprecherstumm = (ImageButton) findViewById(R.id.lautsprecher_ImageButton);
                lautsprecherstumm.setImageResource(R.[COLOR=Red][B]drawable.lautsprecher_laut[/B][/COLOR]);
                //Meldung bringen
                Toast.makeText(MainActivity.this,"Stumm-Modus deaktiviert!", Toast.LENGTH_SHORT).show();
                
            }
...ich danke allen sehr. war eine schwere Geburt, aber nun ist es geschafft :)
 
Zuletzt bearbeitet:
Zurück
Oben Unten