Pickers
本篇筆記是 Android 3.0(API level 11) (含) 後的新語法,但仍可在舊版 Android 裝置上執行。
做法是以 DialogFragment 做為 DatePickerDialog / TimePickerDialog 的容器,並以 DatePickerDialog 做範例。
一開始,按鈕內是空白沒有文字的,若按了按鈕,DatePickerDialog 會顯示目前的日期,當使用者挑選好日期後,將新的日期值傳回給按鈕,並顯示在按鈕內;若按鈕內已有 日期 值,則在呼叫 DatePickerDialog 時也傳目前的值給 DatePickerDialog ,而在挑選新的 日期 後,回傳新的值給 按鈕。
DatePickerFragment.java
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;
import android.widget.TextView;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
int vid;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
super.onCreateDialog(savedInstanceState);
//欲轉換的日期字串
Bundle bData = getArguments();
// 記錄下傳進來的是哪個 button 的 id
vid = bData.getInt("view");
String str = bData.getString("date");
final Calendar c = Calendar.getInstance();
Date date;
if(!str.equals(""))
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//進行轉換
ParsePosition pos = new ParsePosition(0);
date = sdf.parse(str, pos);
c.setTime(date);
}
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// 建立 DatePickerDialog instance 並回傳
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day)
{
Button button = (Button) getActivity().findViewById(vid);
// 注意 月的起始值是 0,所以要加 1
button.setText(""+year+"-"+(month+1)+"-"+day);
}
}
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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.tw.whalin.mypicker.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="起始日期"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/button"
android:onClick="showDatePickerDialog"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/textView"
android:layout_toEndOf="@+id/textView"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="結束日期"
android:id="@+id/textView2"
android:layout_below="@+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="47dp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/button2"
android:onClick="showDatePickerDialog"
android:layout_alignTop="@+id/textView2"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"/>
</RelativeLayout>
MainActivity.java
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void showDatePickerDialog(View v)
{
DialogFragment newFragment = new DatePickerFragment();
Bundle bData = new Bundle();
bData.putInt("view", v.getId());
Button button = (Button) v;
bData.putString("date", button.getText().toString());
newFragment.setArguments(bData);
newFragment.show(getSupportFragmentManager(), "日期挑選器");
}
}
第一次按任一個按鈕時,因按鈕內沒有文字,所以 DatePickerDialog 會顯示今天的日期值
挑選日期後,按 "完成" 則回傳日期給按鈕,並顯示在按鈕內。
若再點擊按鈕,則會將按鈕內的日期值傳給 DatePickerDialog。



沒有留言:
張貼留言