2017年8月28日 星期一

android studio - 如何使用DatePickerDialog

如果你想要讓你的某個元件加入目前的日期,
可是如果使用 EditText 讓使用者填入時間,那真的是非常的麻煩,
而且使用者的格式也會出錯,
只要利用 DatePickerDialog 就可以避免以上的麻煩。

 

完整程式碼

首先在 XML 上面建立好一個Button跟一個TextView
XML如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin">

   <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Date"
       android:id="@+id/dateButton"
       />
   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:id="@+id/dateText"
       />
</LinearLayout>
接著是 MainActivity 主程式部分
public class MainActivity extends AppCompatActivity {
   private int mYear, mMonth, mDay;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       final TextView dateText = (TextView)findViewById(R.id.dateText);
       Button dateButton = (Button)findViewById(R.id.dateButton);
       dateButton.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View view) {
               final Calendar c = Calendar.getInstance();
               mYear = c.get(Calendar.YEAR);
               mMonth = c.get(Calendar.MONTH);
               mDay = c.get(Calendar.DAY_OF_MONTH);
               new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
                   @Override
                   public void onDateSet(DatePicker view, int year, int month, int day) {
                       String format = getString(R.string.set_date) + setDateFormat(year,month,day);
                       dateText.setText(format);
                   }

               }, mYear,mMonth, mDay).show();
           }

       });
   }
   private String setDateFormat(int year,int monthOfYear,int dayOfMonth){
       return String.valueOf(year) + "-"
               + String.valueOf(monthOfYear + 1) + "-"
               + String.valueOf(dayOfMonth);
   }
}
貼上去之後你會發現 Canlendar 是紅色的字, 代表我們還沒把 Canlendar 的 package 載入, 因此我們要選擇下面這段程式來進行 import。
import java.util.Calendar;

程式說明

在這邊要稍微解釋一下 DatePickerDialog 這個建構子所傳入的一些參數
DatePickerDialog(Context context, DatePickerDialog.OnDateSetListener listener, int year, int month, int dayOfMonth)
DatePickerDialog 是一個 Android 寫好的類別,
它可以提供使用者簡單操作的設定日期介面,
呼叫它的方式就是直接 new DatePickerDialog 並且傳入對應的參數
第一個參數是 Context , 也就是說必須把 MainActivity 本身或者 Context 物件傳入。
第二個參數是 OnDateSetListener , 這邊是實作 OnDateSetListener 這個介面的事件, 它提供使用者操控完日期介面後, 所傳回的日期。
第三個是現在是西元幾年, 我們可以透過 Canlendar 的幫忙得到這個資訊。
第四個是現在是幾月, 我們可以透過 Canlendar 的幫忙得到這個資訊。
第五個參數是現在是幾號, 我們可以透過 Canlendar 的幫忙得到這個資訊。
接著上面有多一個 setDateFormat 的方法,
這個方法是可以設置你想要設置的日期格式,
我們將這個格式包裝成一個方法,
透過這個方法回傳我們所需要的字串。
  
private String setDateFormat(int year,int monthOfYear,int dayOfMonth){
   return String.valueOf(year) + "-"
   + String.valueOf(monthOfYear + 1) + "-"
   + String.valueOf(dayOfMonth);
}
這樣一來,你想要的日期就會變成 “年-月-日”的呈現方式在View上面
一開始你會看到這樣的畫面



當你按下Button就會跳出Dialog




選好日期就可以看到




這樣就是一個簡單的 DatePickerDialog 的應用了。
android 5.0以上不需要自行加入按鈕


dialog.setButton(DatePickerDialog.BUTTON_POSITIVE,"確定", new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(DEMODatePickerDialog_Activity.this,"DATA OK",Toast.LENGTH_LONG).show();
  }
});

dialog.setButton(DatePickerDialog.BUTTON_NEGATIVE,"取消", new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(DEMODatePickerDialog_Activity.this,"DATA NO",Toast.LENGTH_LONG).show();
  }
});


EX :

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_demodate_picker_dialog_);
  tv1=(TextView)findViewById(R.id.tv1);

  calender=Calendar.getInstance();
  final int day = calender.get(Calendar.DAY_OF_MONTH);
  int week = calender.get(Calendar.DAY_OF_WEEK);
  int month = calender.get(Calendar.MONTH);
  int year = calender.get(Calendar.YEAR);

  DatePickerDialog dialog = new DatePickerDialog(DEMODatePickerDialog_Activity.this, new DatePickerDialog.OnDateSetListener() {
      @Override
      public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
          tv1.setText(year + "/" + month + "/" + dayOfMonth);
      }
  }, year,month,day);

  dialog.setButton(DatePickerDialog.BUTTON_POSITIVE,"YES", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(DEMODatePickerDialog_Activity.this,"DATA OK",Toast.LENGTH_LONG).show();
      }
  });

  dialog.setButton(DatePickerDialog.BUTTON_NEGATIVE,"取消", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
          Toast.makeText(DEMODatePickerDialog_Activity.this,"DATA NO",Toast.LENGTH_LONG).show();
      }
  });
  
  dialog.show();

}

沒有留言:

張貼留言