2016-07-22 10 views
1

Ich habe versucht, eine ToggleButton zu verwenden, um als ein Lesezeichen Art der Sache in meiner Anwendung zu handeln. Ich benutze das zum ersten Mal. Ich habe meine Umschaltknopf unter onCreateView() wie unten erklärt:android toggle button state immer wahr

bmark = (ToggleButton) v.findViewById(R.id.bmark); 
     bmark.setChecked(false); 

Ich versuche, den Staat nur zu wechseln und zeigen eine Toast Nachricht! Ich habe versucht, die folgenden:

public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     bmark.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       boolean status; 
       if (bmark.isChecked()) status = true; 
       else status = false; 
       Log.w("Bmark status",String.valueOf(status)); 
       if (status) { 
        bmark.setChecked(false); 
        Log.w("Bmark after true",String.valueOf(bmark.isChecked())); 
        Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show(); 
       } else { 
        bmark.setChecked(true); 
        Log.w("Bmark after false",String.valueOf(bmark.isChecked())); 
        Toast.makeText(getActivity(), "Post Bookmarked..!", Toast.LENGTH_SHORT).show(); 
       } 
      } 

     }); 

Jedes Mal, wenn ich die Taste drücken, wird der Status zunächst „true“ lesen, obwohl ich es eingestellt habe auf „false“. Nachdem ich setChecked(false) rufe, wird es auch falsch. Aber wenn ich es noch einmal anklicke, liest es wieder "wahr" und statt "falsch"

Ich weiß nicht, warum es so passiert. Ich möchte es nur jedes Mal umschalten, wenn ich darauf klicke. Bitte hilf mir! Vielen Dank im Voraus :)

+0

FYI die angenommene Antwort ist nicht die optimale Lösung, da sie die Verarbeitung eines booleschen Merkers zur Verfolgung des Status erfordert. – earthw0rmjim

+0

status in antwort ist zusätzlich, weil in orginal code war, vielleicht ist es an verschiedenen ort verwendet, so haben sie nichts optimal oder nicht. –

+0

@MaciejSikora Wie wird es an einer anderen Stelle verwendet, wenn es eine lokale Variable in 'onClick()' ist? Keiner deiner Kommentare ergibt einen Sinn. – earthw0rmjim

Antwort

2

Code ändern zu:

if (bmark.isChecked()){ 
status = true; 
Toast.makeText(getActivity(), "Post Bookmarked..!",Toast.LENGTH_SHORT).show(); 
} 
else { 
status = false; 
Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show(); 
} 

Toggle wechselt selbst überprüft Status, Sie, dass wieder getan so Status zweimal geändert wurde.

2

Das Problem ist, dass Sie den Zustand Ihrer Schaltfläche durch die setChecked() Anrufe in onClick() invertieren.

Verwenden Sie eine OnCheckedChangeListener anstelle ein OnClickListener, so dass Sie sich mit dem Überblick über den Status nicht stören:

bmark.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked) { 
      // checked 
      Toast.makeText(getActivity(), "Post Bookmarked!", Toast.LENGTH_SHORT).show(); 
     } else { 
      // not checked 
      Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show(); 
     } 
    } 
}); 
1

Sie scheinen auf den Button zurück werden Schalen, was es war vorher in Ihre Aussagen. Wenn Sie aufhören, den Status der Schaltfläche im onClickListener zu ändern, sollte es gut funktionieren.

private boolean bmarkStatus = false; 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    bmark.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      bmarkStatus = bmark.isChecked(); 
      if (bmark.isChecked()) Toast.makeText(getActivity(), "Bookmark removed!", Toast.LENGTH_SHORT).show(); 
      else Toast.makeText(getActivity(), "Bookmark added!", Toast.LENGTH_SHORT).show(); 
     } 

    }); 
}