TimePicker是時間選擇控件,那么DatePicker就是日期選擇控件,在日期時間選擇上它們倆常常組合起來使用。 TimePicker常用方法有:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-1.png" alt="這里寫圖片描述" />
除了上述方法,還有一個TimePicker.OnTimeChangedListener ,實現(xiàn)該接口并覆寫相關(guān)方法可以完成時間變化時的監(jiān)聽。
DatePicker常用方法如下表:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-2.png" alt="這里寫圖片描述" />
通過一個實例來看一下如何使用TimePicker和DatePicker控件,并設(shè)置它們的變化監(jiān)聽,布局文件代碼如下:
<?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>
定義了一個DatePicker和一個TimePicker控件及一個TextView控件,TextView控件用于顯示時間和日期。 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è)置之前日期和時間是:" + yearPre + "年" + (month + 1) + "月" + day + "日" + hour + "時" + minutePre + "分");
//設(shè)置時間監(jiān)聽
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
hour = hourOfDay;
minutePre = minute;
textView.setText("設(shè)置之前日期和時間是:" + yearPre + "年" + (month + 1) + "月" + day + "日" + hour + "時" + minutePre + "分");
}
});
//對于日期變化監(jiān)聽,不能直接設(shè)置監(jiān)聽,要通過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è)置之后日期和時間是:" + yearPre + "年" + (month + 1) + "月" + day + "日" + hour + "時" + minutePre + "分");
}
});
}
}
通過上面表格中的方法獲取了當(dāng)前的年、月、日、時、分、秒等信息,在TextView中顯示,設(shè)置了日期變化和時間變化的監(jiān)聽,更新TextView中顯示的時間信息。
運行項目實例:
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計時控件
public class
Chronometer
extends TextView
java.lang.Object
? android.view.View
? android.widget.TextView
? android.widget.Chronometer
計時控件繼承自TextView,其中API中介紹:Chronometr是一個簡單的定時器,你可以給它一個開始時間,并以此定時,或者如果你不給它一個開始時間,它將會使用你的時間通話開始。默認(rèn)情況下它會顯示在當(dāng)前定時器的值得形式"分:秒" 或"MM:SS",或者可以使用set(字符串)的定時器值到一個任意字符串。
其常用方法參考下表:
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="開始計時" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="stop"
android:text="停止計時" />
<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("計時:%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秒計時到!", Toast.LENGTH_LONG).show();
}
}
});
}
//開始按鈕監(jiān)聽
public void start(View view) {
//再次開始時要減去暫停時走過的時間
chronometer.setBase(SystemClock.elapsedRealtime() - elapseTime);
chronometer.start();
}
//暫停按鈕監(jiān)聽
public void stop(View view) {
chronometer.stop();
elapseTime = SystemClock.elapsedRealtime() - chronometer.getBase();//記錄暫停時走過的時間
}
//重置按鈕監(jiān)聽
public void reset(View view) {
elapseTime = 0;
chronometer.setBase(SystemClock.elapsedRealtime());
}
}
本程序調(diào)用了start、stop和setBase方法實現(xiàn)了開始、暫停和重置的功能,還調(diào)用了setOnChronometerTickListener方法,實現(xiàn)了計時監(jiān)聽,計時到達(dá)30秒時,采用Toast進(jìn)行提示。
運行實例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-6.png" alt="這里寫圖片描述" />
前面五節(jié)講解了開發(fā)中經(jīng)常會遇到的控件,這里用一個例子集中再復(fù)習(xí)一下,注冊頁是應(yīng)用中經(jīng)常要編輯的頁面,就以注冊頁面的布局和相關(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="用戶注冊"
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="注冊" />
<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="注冊信息" />
</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)聽
@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)聽
@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)聽
@Override
public void onClick(View v) {
tvInformation.setText("用戶名:" + etUserName.getText().toString() +
";密碼:" + etPassword.getText().toString() + ";性別:" + sexStr +
";出生日期:" + bornStr);
}
});
}
}
這里共設(shè)置了setOnItemSelectedListener(Spinner控件子項選擇監(jiān)聽)、OnDateChangedListener(日期變換監(jiān)聽)、setOnClickListener(單擊監(jiān)聽)三種監(jiān)聽響應(yīng)用戶操作。 運行實例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/8-7.png" alt="這里寫圖片描述" />
DatePicker在布局中占用了太多的界面,導(dǎo)致整個界面看起來很不美觀,在實際開發(fā)中一般使用DatePickerDialog,采用對話框的形式,這樣可以有效減少界面占用,后面在對話框的章節(jié)會詳細(xì)介紹。