2016-09-25 6 views
1

調整する値が最大値または最小値に達したときに無効にするボタンをプログラムによっていくつか生成しています。 (つまり、最大に達すると「増加」ボタンが無効になり、最小に達すると「減少」ボタンが無効になります)無効にすることに加えて、視覚的にボタンの状態を「押した」に設定します制限値に達してボタンが機能しなくなったことを示します。無効なボタンがタッチされたときに押された状態を失う

「増加」ボタンの私のボタンonClickListenerは、次のようになります。

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); 
     } 
    } 
}); 

対応する「減少」onClickListenersが類似しています。

これらのボタンは、自分の状態を変更しているので、私は、ユーザーの指が(https://stackoverflow.com/a/28788780/852795を参照)邪魔にならないように、小さな遅延後Button.setEnabled()Button.setPressed()を調整するHandlerを使用する必要があります。一つの小さな例外を除いて、

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() 
} 

すべてが素晴らしい作品:ここでは上記で使用されてsetEnabled(final Button b, final boolean set)方法があるユーザーがボタンが無効になり、最大に達するために十分な時間「増加」ボタンを押すと「押されたら'状態はtrueに設定されますが、もう一度押すと、' pressed '状態はオフになります。機能的には、ボタンは無効です。私はonClickHandlerが呼び出されないので、これを知っています。なぜ私のボタンは「押した」状態を失っているのですか?これをどうやって止めることができますか?

更新https://stackoverflow.com/a/8693444/852795を見ては、私が押された状態をオフにするのタッチ「インターセプト」するためにonTouchListener()に差し込むてみました。しかし、ボタンも無効になっているので、これも呼び出されません。

+1

つまり私は、ボタンが無効になっているときに押された状態を使用することができるとは思いません。 –

+1

これを処理する信頼性の高い方法は、ボタンの背景をStateListDrawableに変更し、 'disabled'状態を 'pressed'状態と同じに設定することです。 https://developer.android.com/guide/topics/resources/drawable-resource.html#StateList – Egg

+0

ボタンは無効になっており、押された状態は「true」に設定されていますが、すべて正常に動作します。もう一度押すと(無効の間!)、押した状態はオフになります。 –

答えて

1

これを処理する1つの方法は、ボタンのバックグラウンドとしてStateListDrawableを使用し、[無効]状態を[Pressed]状態と同じドロアブルを使用するように設定することです。このようにして、コードでPressed状態を設定する必要がなくなります。

<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> 
関連する問題