TimePicker是時(shí)間選擇控件,那么DatePicker就是日期選擇控件,在日期時(shí)間選擇上它們倆常常組合起來(lái)使用。 TimePicker常用方法有:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-1.png" alt="這里寫圖片描述" />
除了上述方法,還有一個(gè)TimePicker.OnTimeChangedListener ,實(shí)現(xiàn)該接口并覆寫相關(guān)方法可以完成時(shí)間變化時(shí)的監(jiān)聽(tīng)。
DatePicker常用方法如下表:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-2.png" alt="這里寫圖片描述" />
通過(guò)一個(gè)實(shí)例來(lái)看一下如何使用TimePicker和DatePicker控件,并設(shè)置它們的變化監(jiān)聽(tīng),布局文件代碼如下:
<?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">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<DatePicker
android:id="@+id/datePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/textView" />
<TimePicker
android:id="@+id/timePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/datePicker" />
</RelativeLayout>
定義了一個(gè)DatePicker和一個(gè)TimePicker控件及一個(gè)TextView控件,TextView控件用于顯示時(shí)間和日期。 Activity代碼如下:
public class MainActivity extends Activity {
private TextView textView;
private DatePicker datePicker;
private TimePicker timePicker;
private int yearPre, month, day, hour, minutePre;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
datePicker = (DatePicker) findViewById(R.id.datePicker);
timePicker = (TimePicker) findViewById(R.id.timePicker);
yearPre = datePicker.getYear();
month = datePicker.getMonth();
day = datePicker.getDayOfMonth();
hour = timePicker.getCurrentHour();
minutePre = timePicker.getCurrentMinute();
textView.setText("設(shè)置之前日期和時(shí)間是:" + yearPre + "年" + (month + 1) + "月" + day + "日" + hour + "時(shí)" + minutePre + "分");
//設(shè)置時(shí)間監(jiān)聽(tīng)
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
hour = hourOfDay;
minutePre = minute;
textView.setText("設(shè)置之前日期和時(shí)間是:" + yearPre + "年" + (month + 1) + "月" + day + "日" + hour + "時(shí)" + minutePre + "分");
}
});
//對(duì)于日期變化監(jiān)聽(tīng),不能直接設(shè)置監(jiān)聽(tīng),要通過(guò)init方法設(shè)置
datePicker.init(1990, 05, 01, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
yearPre = year;
month = monthOfYear;
day = dayOfMonth;
textView.setText("設(shè)置之后日期和時(shí)間是:" + yearPre + "年" + (month + 1) + "月" + day + "日" + hour + "時(shí)" + minutePre + "分");
}
});
}
}
通過(guò)上面表格中的方法獲取了當(dāng)前的年、月、日、時(shí)、分、秒等信息,在TextView中顯示,設(shè)置了日期變化和時(shí)間變化的監(jiān)聽(tīng),更新TextView中顯示的時(shí)間信息。
運(yùn)行項(xiàng)目實(shí)例:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-3.png" alt="這里寫圖片描述" />
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-4.png" alt="這里寫圖片描述" />
2.Chronometer計(jì)時(shí)控件
public class
Chronometer
extends TextView
java.lang.Object
? android.view.View
? android.widget.TextView
? android.widget.Chronometer
計(jì)時(shí)控件繼承自TextView,其中API中介紹:Chronometr是一個(gè)簡(jiǎn)單的定時(shí)器,你可以給它一個(gè)開(kāi)始時(shí)間,并以此定時(shí),或者如果你不給它一個(gè)開(kāi)始時(shí)間,它將會(huì)使用你的時(shí)間通話開(kāi)始。默認(rèn)情況下它會(huì)顯示在當(dāng)前定時(shí)器的值得形式"分:秒" 或"MM:SS",或者可以使用set(字符串)的定時(shí)器值到一個(gè)任意字符串。
其常用方法參考下表:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-5.png" alt="這里寫圖片描述" />
<?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">
<Chronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/chronometer">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="start"
android:text="開(kāi)始計(jì)時(shí)" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="stop"
android:text="停止計(jì)時(shí)" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="reset"
android:text="重置" />
</LinearLayout>
</RelativeLayout>
Activity 代碼如下:
public class MainActivity extends Activity {
private Chronometer chronometer;
private long elapseTime = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chronometer = (Chronometer) findViewById(R.id.chronometer);
chronometer.setFormat("計(jì)時(shí):%s");
chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
String time = chronometer.getText().toString().replaceAll("[^(\\d{2}:\\d{2})]", "");
if ("00:30".equals(time)) {
Toast.makeText(MainActivity.this, "30秒計(jì)時(shí)到!", Toast.LENGTH_LONG).show();
}
}
});
}
//開(kāi)始按鈕監(jiān)聽(tīng)
public void start(View view) {
//再次開(kāi)始時(shí)要減去暫停時(shí)走過(guò)的時(shí)間
chronometer.setBase(SystemClock.elapsedRealtime() - elapseTime);
chronometer.start();
}
//暫停按鈕監(jiān)聽(tīng)
public void stop(View view) {
chronometer.stop();
elapseTime = SystemClock.elapsedRealtime() - chronometer.getBase();//記錄暫停時(shí)走過(guò)的時(shí)間
}
//重置按鈕監(jiān)聽(tīng)
public void reset(View view) {
elapseTime = 0;
chronometer.setBase(SystemClock.elapsedRealtime());
}
}
本程序調(diào)用了start、stop和setBase方法實(shí)現(xiàn)了開(kāi)始、暫停和重置的功能,還調(diào)用了setOnChronometerTickListener方法,實(shí)現(xiàn)了計(jì)時(shí)監(jiān)聽(tīng),計(jì)時(shí)到達(dá)30秒時(shí),采用Toast進(jìn)行提示。
運(yùn)行實(shí)例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-6.png" alt="這里寫圖片描述" />
前面五節(jié)講解了開(kāi)發(fā)中經(jīng)常會(huì)遇到的控件,這里用一個(gè)例子集中再?gòu)?fù)習(xí)一下,注冊(cè)頁(yè)是應(yīng)用中經(jīng)常要編輯的頁(yè)面,就以注冊(cè)頁(yè)面的布局和相關(guān)邏輯處理,再次總結(jié)一下控件的用法。 布局文件:
<?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">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center_horizontal"
android:padding="10dp"
android:text="用戶注冊(cè)"
android:textColor="@color/colorAccent"
android:textSize="20sp" />
<LinearLayout
android:id="@+id/ll_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:text="用戶名:"
android:textColor="@color/colorAccent"
android:textSize="16sp" />
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/ll_username"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="24dp"
android:text="密碼:"
android:textColor="@color/colorAccent"
android:textSize="16sp" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:password="true" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_sex"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/ll_password"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="24dp"
android:text="性別:"
android:textColor="@color/colorAccent"
android:textSize="16sp" />
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/sex"></Spinner>
</LinearLayout>
<TextView
android:id="@+id/tv_born"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll_sex"
android:layout_marginRight="24dp"
android:text="出生日期:"
android:textColor="@color/colorAccent"
android:textSize="16sp" />
<DatePicker
android:id="@+id/date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_born"></DatePicker>
<Button
android:id="@+id/btn_submit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/date"
android:text="注冊(cè)" />
<TextView
android:id="@+id/tv_information"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_submit"
android:padding="10dp"
android:text="注冊(cè)信息" />
</RelativeLayout>
這里要注意常用屬性的配置方法。 Activity代碼如下:
public class MainActivity extends Activity {
private EditText etUserName, etPassword;
private Spinner spinnerSex;
private DatePicker datePickerBorn;
private Button btnSubmit;
private TextView tvInformation;
private String sexStr;
private String bornStr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
//初始化View
private void initViews() {
bornStr = "1990年05月01日";
etUserName = (EditText) findViewById(R.id.et_username);
etPassword = (EditText) findViewById(R.id.et_password);
spinnerSex = (Spinner) findViewById(R.id.spinner);
spinnerSex.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {//設(shè)置選擇監(jiān)聽(tīng)
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (position == 0) {
sexStr = "男";
} else {
sexStr = "女";
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
sexStr = "男";
}
});
datePickerBorn = (DatePicker) findViewById(R.id.date);
datePickerBorn.init(1990, 04, 01, new DatePicker.OnDateChangedListener() {//日期變化的監(jiān)聽(tīng)
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
bornStr = year + "年" + (monthOfYear + 1) + "月" + dayOfMonth + "日";
}
});
btnSubmit = (Button) findViewById(R.id.btn_submit);
tvInformation = (TextView) findViewById(R.id.tv_information);
btnSubmit.setOnClickListener(new View.OnClickListener() {//單擊監(jiān)聽(tīng)
@Override
public void onClick(View v) {
tvInformation.setText("用戶名:" + etUserName.getText().toString() +
";密碼:" + etPassword.getText().toString() + ";性別:" + sexStr +
";出生日期:" + bornStr);
}
});
}
}
這里共設(shè)置了setOnItemSelectedListener(Spinner控件子項(xiàng)選擇監(jiān)聽(tīng))、OnDateChangedListener(日期變換監(jiān)聽(tīng))、setOnClickListener(單擊監(jiān)聽(tīng))三種監(jiān)聽(tīng)響應(yīng)用戶操作。 運(yùn)行實(shí)例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-7.png" alt="這里寫圖片描述" />
DatePicker在布局中占用了太多的界面,導(dǎo)致整個(gè)界面看起來(lái)很不美觀,在實(shí)際開(kāi)發(fā)中一般使用DatePickerDialog,采用對(duì)話框的形式,這樣可以有效減少界面占用,后面在對(duì)話框的章節(jié)會(huì)詳細(xì)介紹。