如果你想要讓你的某個元件加入目前的日期,
可是如果使用 EditText 讓使用者填入時間,那真的是非常的麻煩,
而且使用者的格式也會出錯,
只要利用 DatePickerDialog 就可以避免以上的麻煩。
完整程式碼
首先在 XML 上面建立好一個Button跟一個TextView
XML如下
<?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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Date"
android:id="@+id/dateButton"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/dateText"
/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Date"
android:id="@+id/dateButton"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/dateText"
/>
</LinearLayout>
接著是 MainActivity 主程式部分
public class MainActivity extends AppCompatActivity {
private int mYear, mMonth, mDay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView dateText = (TextView)findViewById(R.id.dateText);
Button dateButton = (Button)findViewById(R.id.dateButton);
dateButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
String format = getString(R.string.set_date) + setDateFormat(year,month,day);
dateText.setText(format);
}
}, mYear,mMonth, mDay).show();
}
});
}
private String setDateFormat(int year,int monthOfYear,int dayOfMonth){
return String.valueOf(year) + "-"
+ String.valueOf(monthOfYear + 1) + "-"
+ String.valueOf(dayOfMonth);
}
}
private int mYear, mMonth, mDay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView dateText = (TextView)findViewById(R.id.dateText);
Button dateButton = (Button)findViewById(R.id.dateButton);
dateButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
String format = getString(R.string.set_date) + setDateFormat(year,month,day);
dateText.setText(format);
}
}, mYear,mMonth, mDay).show();
}
});
}
private String setDateFormat(int year,int monthOfYear,int dayOfMonth){
return String.valueOf(year) + "-"
+ String.valueOf(monthOfYear + 1) + "-"
+ String.valueOf(dayOfMonth);
}
}
貼上去之後你會發現 Canlendar 是紅色的字, 代表我們還沒把 Canlendar 的 package 載入, 因此我們要選擇下面這段程式來進行 import。
import java.util.Calendar;
程式說明
在這邊要稍微解釋一下 DatePickerDialog 這個建構子所傳入的一些參數
DatePickerDialog(Context context, DatePickerDialog.OnDateSetListener listener, int year, int month, int dayOfMonth)
DatePickerDialog 是一個 Android 寫好的類別,
它可以提供使用者簡單操作的設定日期介面,
呼叫它的方式就是直接 new DatePickerDialog 並且傳入對應的參數
第一個參數是 Context , 也就是說必須把 MainActivity 本身或者 Context 物件傳入。
第二個參數是 OnDateSetListener , 這邊是實作 OnDateSetListener 這個介面的事件, 它提供使用者操控完日期介面後, 所傳回的日期。
第三個是現在是西元幾年, 我們可以透過 Canlendar 的幫忙得到這個資訊。
第四個是現在是幾月, 我們可以透過 Canlendar 的幫忙得到這個資訊。
第五個參數是現在是幾號, 我們可以透過 Canlendar 的幫忙得到這個資訊。
接著上面有多一個 setDateFormat 的方法,
這個方法是可以設置你想要設置的日期格式,
我們將這個格式包裝成一個方法,
透過這個方法回傳我們所需要的字串。
private String setDateFormat(int year,int monthOfYear,int dayOfMonth){
return String.valueOf(year) + "-"
+ String.valueOf(monthOfYear + 1) + "-"
+ String.valueOf(dayOfMonth);
}
return String.valueOf(year) + "-"
+ String.valueOf(monthOfYear + 1) + "-"
+ String.valueOf(dayOfMonth);
}
這樣一來,你想要的日期就會變成 “年-月-日”的呈現方式在View上面
一開始你會看到這樣的畫面
當你按下Button就會跳出Dialog
選好日期就可以看到
這樣就是一個簡單的 DatePickerDialog 的應用了。
android 5.0以上不需要自行加入按鈕
dialog.setButton(DatePickerDialog.BUTTON_POSITIVE,"確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DEMODatePickerDialog_Activity.this,"DATA OK",Toast.LENGTH_LONG).show();
}
});
dialog.setButton(DatePickerDialog.BUTTON_NEGATIVE,"取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DEMODatePickerDialog_Activity.this,"DATA NO",Toast.LENGTH_LONG).show();
}
});
EX :
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demodate_picker_dialog_);
tv1=(TextView)findViewById(R.id.tv1);
calender=Calendar.getInstance();
final int day = calender.get(Calendar.DAY_OF_MONTH);
int week = calender.get(Calendar.DAY_OF_WEEK);
int month = calender.get(Calendar.MONTH);
int year = calender.get(Calendar.YEAR);
DatePickerDialog dialog = new DatePickerDialog(DEMODatePickerDialog_Activity.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
tv1.setText(year + "/" + month + "/" + dayOfMonth);
}
}, year,month,day);
dialog.setButton(DatePickerDialog.BUTTON_POSITIVE,"YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DEMODatePickerDialog_Activity.this,"DATA OK",Toast.LENGTH_LONG).show();
}
});
dialog.setButton(DatePickerDialog.BUTTON_NEGATIVE,"取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DEMODatePickerDialog_Activity.this,"DATA NO",Toast.LENGTH_LONG).show();
}
});
dialog.show();
}
沒有留言:
張貼留言