【Android Studio】日期 / 時間 挑選器 應用

參考資料 ----
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