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。
沒有留言:
張貼留言