2016-09-25 32 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是相似的。

因爲這些按鈕都改變自己的狀態,我需要使用Handler一個小的延遲後調整Button.setEnabled()Button.setPressed(),使用戶的手指不會礙事(見https://stackoverflow.com/a/28788780/852795)。下面是使用上述setEnabled(final Button b, final boolean set)方法:

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

一切的偉大工程,一個小小的例外:當用戶按下「增加」按鈕足夠的時間到達按鈕將被禁用的最大值和「壓'狀態將被設置爲true,但是,如果再次按下該狀態,則「按下」狀態將被關閉。在功能上,該按鈕被禁用。我知道這是因爲onClickHandler沒有被調用。那爲什麼我的按鈕失去了'按下'狀態?我怎樣才能阻止這種情況發生?

更新:縱觀https://stackoverflow.com/a/8693444/852795我試圖堵到onTouchListener()以「截取」那是關閉狀態,按下觸摸。但是,這也不會被調用,因爲我想象,該按鈕被禁用。

+1

我不認爲你可以使用按下狀態時,該按鈕被禁用。 –

+1

更可靠的方法來處理這可能是更改您的按鈕背景爲一個StateListDrawable與其「禁用」狀態設置爲其「按下」狀態相同。 https://developer.android.com/guide/topics/resources/drawable-resource.html#StateList – Egg

+0

該按鈕被禁用,按下的狀態被設置爲'true',這一切正常。如果再次按下(禁用時),則按下的狀態將被關閉。 –

回答

1

處理此問題的一種方法是使用StateListDrawable作爲按鈕的背景,並將Disabled狀態設置爲使用與Pressed狀態相同的drawable。這樣你可以避免必須在代碼中設置壓制狀態。

<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>