2016-09-25 2 views
1

Ich erstelle programmgesteuert eine Anzahl von Tasten (einige um einen Wert zu erhöhen, andere um einen Wert zu verringern), die ich deaktiviere, wenn der eingestellte Wert entweder ein Maximum oder Minimum erreicht. (Das heißt, die Schaltfläche "Erhöhen" ist deaktiviert, wenn das Maximum erreicht wird, während die Schaltfläche "Verringern" deaktiviert ist, wenn das Minimum erreicht ist.) Zusätzlich zur Deaktivierung setze ich den Status der Schaltfläche auch visuell auf "gedrückt" zeigt an, dass der Grenzwert erreicht wurde und der Button nicht mehr funktioniert.Deaktivierte Taste verliert den gedrückten Zustand bei Berührung

Meine Taste OnClickListener für die 'Erhöhung' Tasten wie folgt aussehen:

increase.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     // do some stuff 

     // here I enable the corresponding 'decrease' button because once you increase you can then decrease 
     setEnabled(decrease, true); 

     // if the maximum value is obtained, I disable the 'increase' button because you can't go higher 
     if (value == maximum) { 
      setEnabled(increase, false); 
     } 
    } 
}); 

Die entsprechenden 'Abnahme' onClickListeners ähnlich sind.

Da diese Taste ihre eigenen Zustand zu ändern, muss ich ein Handler verwenden Button.setEnabled() und Button.setPressed() nach einer kleinen Verzögerung einzustellen, so dass der Finger des Benutzers nicht in die Quere kommen (siehe https://stackoverflow.com/a/28788780/852795). Hier ist die setEnabled(final Button b, final boolean set) Methode, die verwendet wird, oben:

private void setEnabled(final Button b, final boolean set) { 
    Handler refresh = new Handler(Looper.getMainLooper()); 
    refresh.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      b.setEnabled(set); 
      b.setPressed(!set); 
     } 
    }, 250); // delayed post required to make pressed button accept setPressed() 
} 

Alles funktioniert gut, mit einer kleinen Ausnahme: Sobald ein Benutzer der ‚Erhöhung‘ Taste oft genug drückt das Maximum erreichen Sie die Taste deaktiviert, und die ‚gedrückt 'state wird auf' true 'gesetzt, wenn es dann noch einmal gedrückt wird, wird der Zustand' pressed 'ausgeschaltet. Funktional ist die Schaltfläche deaktiviert. Ich weiß das, weil der onClickHandler nicht aufgerufen wird. Warum verliert mein Knopf dann den Status "gedrückt"? Wie kann ich das verhindern?

aktualisieren: bei https://stackoverflow.com/a/8693444/852795 der Suche habe ich versucht, die Berührung in die onTouchListener(), um ein Verstopfen ‚abfangen‘, der den gedrückten Zustand ist ausgeschaltet. Dies wird jedoch auch nicht aufgerufen, da ich mir vorstelle, die Schaltfläche ist deaktiviert.

+1

Ich glaube nicht, dass Sie den gedrückten Zustand verwenden können, wenn die Schaltfläche deaktiviert ist. –

+1

Eine zuverlässigere Möglichkeit, dies zu umgehen, könnte darin bestehen, den Hintergrund Ihrer Schaltfläche in eine StateListDrawable zu ändern, wobei der Status "deaktiviert" auf den Zustand "gedrückt" gesetzt ist. https://developer.android.com/guide/topics/resources/drawable-resource.html#StateList – Egg

+0

Die Schaltfläche ist deaktiviert und der gedrückte Zustand ist auf 'wahr' gesetzt, was alles gut funktioniert. Wenn es dann erneut gedrückt wird (während deaktiviert!), Wird der gedrückte Zustand ausgeschaltet. –

Antwort

1

Eine Möglichkeit, dies zu umgehen, wäre, eine StateListDrawable als Hintergrund der Schaltfläche zu verwenden und den deaktivierten Zustand so einzustellen, dass er dasselbe Zeichen wie der gepresste Status verwendet. Auf diese Weise können Sie vermeiden, den gedrückten Status im Code festzulegen.

dh

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
      android:drawable="@drawable/btn_pressed" /> <!-- pressed --> 
    <item android:state_enabled="false" android:drawable="@drawable/btn_pressed"/> <!-- disabled (same as pressed) --> 
    <item android:state_enabled="true" android:drawable="@drawable/btn_normal"/> 
</selector> 
Verwandte Themen