2016-07-05

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

參考資料 ----
Pickers


本篇筆記是 Android 3.0(API level 11) (含) 後的新語法,但仍可在舊版 Android 裝置上執行。

做法是以 DialogFragment 做為 DatePickerDialog / TimePickerDialog 的容器,並以 DatePickerDialog 做範例

一開始,按鈕內是空白沒有文字的,若按了按鈕,DatePickerDialog 會顯示目前的日期,當使用者挑選好日期後,將新的日期值傳回給按鈕,並顯示在按鈕內若按鈕內已有 日期 值,則在呼叫 DatePickerDialog 時也傳目前的值給 DatePickerDialog ,而在挑選新的 日期 後,回傳新的值給 按鈕


DatePickerFragment.java
  1.  
  2. import android.app.DatePickerDialog;
  3. import android.app.Dialog;
  4. import android.os.Bundle;
  5. import android.support.v4.app.DialogFragment;
  6. import android.widget.DatePicker;
  7. import android.widget.TextView;
  8.  
  9. import java.text.ParsePosition;
  10. import java.text.SimpleDateFormat;
  11. import java.util.Calendar;
  12. import java.util.Date;
  13.  
  14. public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
  15. {
  16. int vid;
  17.  
  18. @Override
  19. public Dialog onCreateDialog(Bundle savedInstanceState)
  20. {
  21. super.onCreateDialog(savedInstanceState);
  22.  
  23. //欲轉換的日期字串
  24. Bundle bData = getArguments();
  25. // 記錄下傳進來的是哪個 button 的 id
  26. vid = bData.getInt("view");
  27. String str = bData.getString("date");
  28. final Calendar c = Calendar.getInstance();
  29. Date date;
  30. if(!str.equals(""))
  31. {
  32. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  33. //進行轉換
  34. ParsePosition pos = new ParsePosition(0);
  35. date = sdf.parse(str, pos);
  36. c.setTime(date);
  37. }
  38. int year = c.get(Calendar.YEAR);
  39. int month = c.get(Calendar.MONTH);
  40. int day = c.get(Calendar.DAY_OF_MONTH);
  41.  
  42. // 建立 DatePickerDialog instance 並回傳
  43. return new DatePickerDialog(getActivity(), this, year, month, day);
  44. }
  45.  
  46. public void onDateSet(DatePicker view, int year, int month, int day)
  47. {
  48. Button button = (Button) getActivity().findViewById(vid);
  49. // 注意 月的起始值是 0,所以要加 1
  50. button.setText(""+year+"-"+(month+1)+"-"+day);
  51. }
  52. }
  53.  


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
  1.  
  2. import android.os.Bundle;
  3. import android.support.v4.app.DialogFragment;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.view.View;
  6. import android.widget.Button;
  7.  
  8. public class MainActivity extends AppCompatActivity
  9. {
  10.  
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState)
  13. {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. }
  17.  
  18. public void showDatePickerDialog(View v)
  19. {
  20. DialogFragment newFragment = new DatePickerFragment();
  21. Bundle bData = new Bundle();
  22. bData.putInt("view", v.getId());
  23. Button button = (Button) v;
  24. bData.putString("date", button.getText().toString());
  25. newFragment.setArguments(bData);
  26. newFragment.show(getSupportFragmentManager(), "日期挑選器");
  27. }
  28. }
  29.  

第一次按任一個按鈕時,因按鈕內沒有文字,所以 DatePickerDialog 會顯示今天的日期值



挑選日期後,按 "完成" 則回傳日期給按鈕,並顯示在按鈕內。



若再點擊按鈕,則會將按鈕內的日期值傳給 DatePickerDialog

沒有留言:

張貼留言