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