Button按鈕是Android應(yīng)用中最常用到的控件,說(shuō)它為交互之王一點(diǎn)都不過(guò)分,每個(gè)應(yīng)用中都包含了多個(gè)Button響應(yīng)和解決用戶各種點(diǎn)擊交互事件,下面我們看一下API文檔中怎么定義Button控件的吧,其繼承結(jié)構(gòu)如下:
public class
Button
extends TextView
java.lang.Object
? android.view.View
? android.widget.TextView
? android.widget.Button
可以看出Button控件繼承自TextView控件,自然TextView的屬性和方法在Button中也同樣適用。實(shí)現(xiàn)Button控件的單擊監(jiān)聽(tīng)有兩種方式。
經(jīng)典方式,獲取Button對(duì)象,設(shè)置其監(jiān)聽(tīng)事件,參考API提供的方法:
public class MyActivity extends Activity {
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.content_layout_id);
final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
}
});
}
}
第二種,在布局文件中配置onClick屬性,并設(shè)置相應(yīng)的監(jiān)聽(tīng)方法名:
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/self_destruct"
android:onClick="selfDestruct" />
在Activity中編寫(xiě)同名方法,在方法中處理單擊邏輯:
public void selfDestruct(View view) {
// Kabloey
}
下面通過(guò)一個(gè)具體實(shí)例,來(lái)看一下這兩種方式是如何實(shí)現(xiàn)的
布局文件如下:(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="實(shí)現(xiàn)單擊監(jiān)聽(tīng)接口"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="test"
android:layout_below="@+id/btn"
android:text="onClick實(shí)現(xiàn)單擊監(jiān)聽(tīng)"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
可以看出第二個(gè)Button配置了onClick屬性。
Activity程序(MainActivity.java)
public class MainActivity extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"通過(guò)調(diào)用單擊監(jiān)聽(tīng)接口實(shí)現(xiàn)單擊監(jiān)聽(tīng)",Toast.LENGTH_SHORT).show();
}
});
}
public void test(View view){
Toast.makeText(MainActivity.this,"通過(guò)配置onClick屬性實(shí)現(xiàn)單擊監(jiān)聽(tīng)",Toast.LENGTH_SHORT).show();
}
}
第一個(gè)Button實(shí)現(xiàn)了單擊監(jiān)聽(tīng)接口,采用匿名內(nèi)部類的方式,第二個(gè)Button通過(guò)編寫(xiě)的test方法實(shí)現(xiàn)單擊監(jiān)聽(tīng)。 運(yùn)行實(shí)例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/3-1.png" alt="這里寫(xiě)圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/3-2.png" alt="這里寫(xiě)圖片描述" />
一般APP都有用戶注冊(cè)功能,用戶注冊(cè)需要獲取手機(jī)驗(yàn)證碼,點(diǎn)擊驗(yàn)證碼短信平臺(tái)通過(guò)短信的形式發(fā)送到用戶手機(jī),為了防止用戶多次點(diǎn)擊并提高用戶體驗(yàn),下面引入一個(gè)實(shí)例,提供點(diǎn)擊一次即將Button設(shè)為不可點(diǎn)擊并在Button上顯示倒計(jì)時(shí)的功能,顯示倒計(jì)時(shí)是為了告知用戶下一次可以獲取驗(yàn)證碼的剩余時(shí)間,提高用戶體驗(yàn)。 布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/btn" />
<Button
android:id="@+id/btn"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="獲取驗(yàn)證碼" />
</RelativeLayout>
Activity程序(MainActivity.java)
public class MainActivity extends Activity {
private Button buttonClock;
private TimeCount timeCount;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonClock=(Button)findViewById(R.id.btn);
timeCount=new TimeCount(60*1000,1000);//實(shí)例化TimeCount類
buttonClock.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
timeCount.start();//調(diào)用start方法開(kāi)始倒計(jì)時(shí)
}
});
}
class TimeCount extends CountDownTimer{
//構(gòu)造方法
public TimeCount(long totalTime,long interval){
super (totalTime,interval);
}
@Override
public void onTick(long millisUntilFinished) {//覆寫(xiě)方法-計(jì)時(shí)中
buttonClock.setEnabled(false);//按鈕不可點(diǎn)擊
//參數(shù)millisUntilFinished表示剩余時(shí)間
buttonClock.setText(millisUntilFinished/1000+"秒");
}
@Override
public void onFinish() {//覆寫(xiě)方法,即時(shí)結(jié)束
buttonClock.setEnabled(true);//恢復(fù)按鈕可點(diǎn)擊
buttonClock.setText("重新獲取");//修改按鈕提示文字
}
}
}
這里需要說(shuō)明: 這里用到了CountDownTimer類,它是一個(gè)抽象類,這個(gè)類可以實(shí)現(xiàn)倒計(jì)時(shí)功能,覆寫(xiě)onTick方法可以實(shí)現(xiàn)定期通知的操作,覆寫(xiě)onFinish方法,執(zhí)行定時(shí)結(jié)束后的相關(guān)操作。API中給出了參考實(shí)例:
new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
mTextField.setText("done!");
}
}.start();
CountDownTimer類實(shí)例化時(shí)需要傳遞兩個(gè)參數(shù),第一個(gè)參數(shù)是倒計(jì)時(shí)總時(shí)長(zhǎng),第二個(gè)參數(shù)是時(shí)間間隔。從樣例代碼中也可以看出,實(shí)現(xiàn)該抽象類同時(shí)覆寫(xiě)了兩個(gè)方法onTick方法(根據(jù)實(shí)例化CountDownTimer類時(shí)傳入的時(shí)間間隔,定期調(diào)用的方法,樣例中利用它實(shí)現(xiàn)了信息更新的操作)和onFinish方法(倒計(jì)時(shí)結(jié)束時(shí)調(diào)用的方法)。最后調(diào)用其start方法,開(kāi)始倒計(jì)時(shí),從API文檔中可以看出start方法考慮了線程安全問(wèn)題。
運(yùn)行項(xiàng)目實(shí)例: 首先Button上顯示”獲取驗(yàn)證碼”信息。
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/3-3.png" alt="這里寫(xiě)圖片描述" />
點(diǎn)擊后顯示倒計(jì)時(shí)秒數(shù),此時(shí)Button不可點(diǎn)擊。
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/3-4.png" alt="這里寫(xiě)圖片描述" />
倒計(jì)時(shí)結(jié)束后,Button上顯示“重新獲取”字樣,Button可點(diǎn)擊。
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/3-5.png" alt="這里寫(xiě)圖片描述" />