Android按鈕狀態(Button State)

在Android中,drawable widget有很多種state,透過 xml 的 <selector>,也就是定義 StateList Drawable,能夠讓Android針對drawable(例如Button)的狀態,選擇要顯示的圖片。

本文會
  1. 舉例
  2. 列出state列表

例子


舉例來說,我想要一組這樣的按鈕

                 




分為上(btnUp)和下(btnDn)兩個按鈕,有兩個功能:

  • 提示使用者目前位置(上或下)
  • 切換上下頁

按鈕在平時(白色),按下時(邊框黃色),以及按下後(黃色)的圖各自不同。

因此,對任一個按鈕來說,需要有三個state:正常,按下,選擇(按下後)。
在Android的xml中,需要用<selector>配合<item>呈現三種state,對應的xml tag是

  • 按下 - state_pressed
  • 選擇 - state_selected
  • 正常 (不用特別定義)

!注意! Android會根據item的state一個一個往下找,一找到適合的state,便使用此state的drawable作顯示,因此<item>的順序非常重要。全部state定義可以在Developer Guide : StateList找到。例子的button state定義放在drawable/button_up.xml:

button_up.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <item android:state_pressed="true"
          android:drawable="@drawable/btn_up_pressed" />
    
    <item android:state_selected="true"
          android:drawable="@drawable/btn_up_selected" /> 
    
    <item android:drawable="@drawable/btn_up" />

</selector>

button_dn.xml和buttun_up.xml一模一樣,只是將drawable改成btn_dn_xxx。

在activity中加入這組button:

main_activity.xml
<LinearLayout 
    android:id="@+id/btn_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:orientation="vertical">
    <Button 
        android:id="@+id/btn_up"
        android:layout_width="80dp"
        android:layout_height="220dp"
        android:background="@drawable/situation_button_up"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="5dp" />
    <Button 
        android:id="@+id/btn_dn"
        android:layout_width="80dp"
        android:layout_height="220dp"
        android:background="@drawable/situation_button_dn"/>
</LinearLayout>

使用這個button的java code:

MainActivity.java
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        final Button btnUp = (Button) findViewById(R.id.btn_up);
        final Button btnDn = (Button) findViewById(R.id.btn_dn);

        btnUp.setSelected(true);
        btnUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btnUp.setSelected(true);
                btnDn.setSelected(false);
                // Do something
            }
        });
        btnDn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btnUp.setSelected(false);
                btnDn.setSelected(true);
                // Do something
            }
        });
    }
}

State列表



Android Object State描述
android:state_pressed物件被按下時
android:state_focused物件由軌跡球或D-pad選取時
android:state_hovered物件由指標覆蓋時
android:state_selected物件被選取時
android:state_checkable物件是checkable時(註1)
android:state_checked物件被點選時
android:state_enabled物件能夠接收touch/click event時
android:state_activated(API11以上)物件被持續選擇時
(例如highlight選上的list item)
android:state_window_focused當物件所屬的application在前景時

(註1) 只有當這個物件能在checkable和non-checkable之間切換時才有效

Comments