Android按鈕狀態(Button State)
在Android中,drawable widget有很多種state,透過 xml 的 <selector>,也就是定義 StateList Drawable,能夠讓Android針對drawable(例如Button)的狀態,選擇要顯示的圖片。
本文會
舉例來說,我想要一組這樣的按鈕
分為上(btnUp)和下(btnDn)兩個按鈕,有兩個功能:
按鈕在平時(白色),按下時(邊框黃色),以及按下後(黃色)的圖各自不同。
因此,對任一個按鈕來說,需要有三個state:正常,按下,選擇(按下後)。
在Android的xml中,需要用<selector>配合<item>呈現三種state,對應的xml tag是
!注意! Android會根據item的state一個一個往下找,一找到適合的state,便使用此state的drawable作顯示,因此<item>的順序非常重要。全部state定義可以在Developer Guide : StateList找到。例子的button state定義放在drawable/button_up.xml:
button_up.xml
button_dn.xml和buttun_up.xml一模一樣,只是將drawable改成btn_dn_xxx。
在activity中加入這組button:
main_activity.xml
使用這個button的java code:
MainActivity.java
(註1) 只有當這個物件能在checkable和non-checkable之間切換時才有效
本文會
例子
舉例來說,我想要一組這樣的按鈕
分為上(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
Post a Comment