public abstract class
CompoundButton
extends Button
implements Checkable
java.lang.Object
? android.view.View
? android.widget.TextView
? android.widget.Button
? android.widget.CompoundButton
Known Direct Subclasses
CheckBox, RadioButton, Switch, ToggleButton
由繼承結(jié)構(gòu)可以看出Switch和ToggleButton都繼承自CompoundButton這一抽象類(lèi)。因此它們屬性和方法都是類(lèi)似的,首先看一下ToggleButton的用法。
常用的屬性很簡(jiǎn)單就兩個(gè):
開(kāi)關(guān)監(jiān)聽(tīng)為:setOnCheckedChangeListener,覆寫(xiě)onCheckedChanged(CompoundButton buttonView, boolean isChecked)方法,其中isChecked表示是否選中。
用過(guò)小米手電筒APP的用戶都會(huì)對(duì)它的UI有印象,也就是開(kāi)燈時(shí),手機(jī)屏幕里的燈泡也會(huì)亮,關(guān)燈時(shí)手機(jī)屏幕里的燈泡則不會(huì)亮,下面我們就結(jié)合ToggleButton實(shí)現(xiàn)這一功能。 主布局文件(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv"
android:layout_margin="20dp"
android:layout_gravity="center"
android:src="@drawable/off"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ToggleButton
android:id="@+id/tb"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="關(guān)燈"
android:disabledAlpha="@android:integer/config_longAnimTime"
android:textSize="25sp"
android:layout_margin="20dp"
android:textOn="開(kāi)燈" />
</LinearLayout>
設(shè)置了一個(gè)ImageView用于顯示燈泡的開(kāi)關(guān),設(shè)置了一個(gè)ToggleButton當(dāng)做開(kāi)關(guān),并設(shè)置了textOff和textOn屬性。
MainActivity.java代碼(MainActivity.java)
public class MainActivity extends AppCompatActivity {
private ToggleButton toggleButton;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toggleButton=(ToggleButton)findViewById(R.id.tb);
imageView=(ImageView)findViewById(R.id.iv);
toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
imageView.setImageResource(isChecked?R.drawable.on:R.drawable.off);
}
});
}
}
這里設(shè)置了setOnCheckedChangeListener選擇變化的監(jiān)聽(tīng),并覆寫(xiě)了其onCheckedChanged方法,根據(jù)參數(shù)isChecked判斷要顯示哪張圖片。 運(yùn)行實(shí)例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/5-1.png" alt="這里寫(xiě)圖片描述" />
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/5-2.png" alt="這里寫(xiě)圖片描述" />
選擇關(guān)燈時(shí)燈泡顯示的也是暗的,選擇開(kāi)燈,燈泡相應(yīng)變亮。 有同學(xué)會(huì)說(shuō)這樣的開(kāi)關(guān)按鈕不夠直觀、不夠美觀,下面介紹一下如何自定義ToggleButton的外觀。
首先準(zhǔn)備兩張圖片:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/5-3.png" alt="這里寫(xiě)圖片描述" />
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/5-4.png" alt="這里寫(xiě)圖片描述" />
在drawable文件下創(chuàng)建xml文件,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/on" android:state_checked="true"/>
<item android:drawable="@drawable/off" android:state_checked="false"/>
</selector>
設(shè)置了在android:state_checked為true的時(shí)候顯示on圖片,在android:state_checked為false時(shí)顯示off圖片。 在styles.xml文件中添加代碼:
<style name="MySwitch" parent="@android:style/Widget.CompoundButton">
<item name="android:button">@drawable/switch_button</item>
</style>
布局文件代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ToggleButton
android:id="@+id/sw"
style="@style/MySwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00000000"
android:checked="true"
android:textOff="@null"
android:textOn="@null" />
</LinearLayout>
設(shè)置了style屬性,引入我們?cè)O(shè)置的style樣式,并設(shè)置textOff和textOn為@null這樣就不會(huì)在圖片上顯示文字了。運(yùn)行項(xiàng)目實(shí)例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/5-5.png" alt="這里寫(xiě)圖片描述" />
這時(shí)可以看到ToggleButton的外觀改變了。
這里外觀實(shí)現(xiàn)了Switch的自定義樣式,功能實(shí)現(xiàn)了動(dòng)態(tài)控制WIFI的開(kāi)關(guān)。首先看一下滑塊外觀(switch_bg.xml):
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:drawable="@drawable/enable" />
<item android:state_pressed="true" android:drawable="@drawable/press" />
<item android:state_checked="true" android:drawable="@drawable/check_on" />
</selector>
這里定義了三種狀態(tài)下的圖片,一種是state_enable(可用狀態(tài))為true時(shí),一種是state_pressed(按下?tīng)顟B(tài)時(shí))為true,一種是state_checked(選擇狀態(tài))為true。每種狀態(tài)對(duì)應(yīng)不同的背景圖片。 對(duì)于滑動(dòng)軌道的背景定義了兩種不同的圖片(track_bg.xml):
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/track_disable" android:state_enabled="false" />
<item android:drawable="@drawable/track_default" />
</selector>
一種是可用狀態(tài)即默認(rèn)狀態(tài)下顯示track_default圖片,一種是不可用狀態(tài)下,顯示track_default圖片。 主布局文件如下:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center">
<Button
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="禁用Switch按鈕"
android:layout_marginBottom="15dp"
android:onClick="button_click"/>
<Switch
android:id="@+id/sw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="OFF"
android:textOn="ON"
android:layout_alignParentRight="true"
android:layout_marginRight="20dp"
android:thumb="@drawable/switch_bg"
android:track="@drawable/track_bg"
android:layout_marginBottom="15dp" />
</LinearLayout>
定義了一個(gè)按鈕Button,設(shè)置了其onClick事件用于動(dòng)態(tài)控制Switch是否可用。定義了一個(gè)Switch按鈕,設(shè)置了其thumb即滑塊外觀和track即滑動(dòng)軌道外觀分別為上面定義的兩個(gè)圖片。 MainActivity.java代碼如下:
public class MainActivity extends Activity {
Button button;
Switch sw;
boolean is_enable = true;
WifiManager wifiManager;
AudioManager audioManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.btn);
sw = (Switch)findViewById(R.id.sw);
sw.setChecked(true);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
sw.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isChecked()) {
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
} else {
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(false);
}
}
});
}
public void button_click(View view){
if(is_enable == true)
{
is_enable = false;
button.setText("啟用Switch按鈕");
}
else{
is_enable = true;
button.setText("禁用Switch按鈕");
}
sw.setEnabled(is_enable);
}
}
設(shè)置了布爾型的標(biāo)識(shí)位is_enable用于判斷Switch的使能狀態(tài),并動(dòng)態(tài)控制Button按鈕上文本的顯示。實(shí)現(xiàn)了setOnCheckedChangeListener監(jiān)聽(tīng),判斷Switch的選擇與否,根據(jù)isChecked參數(shù)進(jìn)行判斷是否選中。 對(duì)于開(kāi)啟和關(guān)閉WIFI,這里首先通過(guò)getSystemService方法并傳入Context.WIFI_SERVICE常量獲取WifiManager對(duì)象,調(diào)用這個(gè)對(duì)象的setWifiEnable傳入true或者false就可以控制WIFI的開(kāi)啟或關(guān)閉了。注意這里要配置相應(yīng)的權(quán)限,AndroidManifest.xml代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="demo.androidwar.com.switchdemo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
</manifest>
配置了CHANGE_WIFI_STATE的權(quán)限。 運(yùn)行項(xiàng)目實(shí)例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/5-6.png" alt="這里寫(xiě)圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/5-7.png" alt="這里寫(xiě)圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/5-8.png" alt="這里寫(xiě)圖片描述" />
第一個(gè)圖片展示開(kāi)啟WIFI的狀態(tài),我們可以在手機(jī)狀態(tài)欄中看到WIFI的狀態(tài)圖標(biāo),第二個(gè)圖片展示關(guān)閉WIFI的狀態(tài),手機(jī)狀態(tài)欄中已經(jīng)看不到WIFI狀態(tài)圖標(biāo)了,第三個(gè)圖片是禁用Switch按鈕的狀態(tài)。