【问题标题】:Date picker in AndroidAndroid中的日期选择器
【发布时间】:2011-03-18 23:35:07
【问题描述】:

任何人都可以发布 Android 中简单日期选择器的示例代码吗?

如果日期选择器在 Android 中不可用,则需要一个选择日期的选项。

【问题讨论】:

    标签: android date picker


    【解决方案1】:

    使用日期选择器

    http://developer.android.com/reference/android/widget/DatePicker.html

    从 API 级别 1 开始可用

    这里是一个如何使用 DatePickerDialog 的示例。

    首先在你的 layout.xml 中添加一个 TextView 和一个 Button

    <Button android:id="@+id/myDatePickerButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Choose Date"/>
    
    <TextView android:id="@+id/showMyDate"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"/>
    

    接下来,您必须在布局的 onCreate 方法中初始化 Button 和 TextView。 你需要这个类变量

    private int mYear;
    private int mMonth;
    private int mDay;
    
    private TextView mDateDisplay;
    private Button mPickDate;
    
    static final int DATE_DIALOG_ID = 0;
    

    这里是 onCreate 方法

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        mDateDisplay = (TextView) findViewById(R.id.showMyDate);        
        mPickDate = (Button) findViewById(R.id.myDatePickerButton);
    
        mPickDate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog(DATE_DIALOG_ID);
            }
        });
    
        // get the current date
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);
    
        // display the current date
        updateDisplay();
    }
    

    UpdateDisplay 方法:

    private void updateDisplay() {
        this.mDateDisplay.setText(
            new StringBuilder()
                    // Month is 0 based so add 1
                    .append(mMonth + 1).append("-")
                    .append(mDay).append("-")
                    .append(mYear).append(" "));
    }
    

    DatePickDialog 的回调监听器

    private DatePickerDialog.OnDateSetListener mDateSetListener =
        new DatePickerDialog.OnDateSetListener() {
            public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                mYear = year;
                mMonth = monthOfYear;
                mDay = dayOfMonth;
                updateDisplay();
            }
        };
    

    onCreateDialog 方法,由 showDialog() 调用

    @Override
    protected Dialog onCreateDialog(int id) {
       switch (id) {
       case DATE_DIALOG_ID:
          return new DatePickerDialog(this,
                    mDateSetListener,
                    mYear, mMonth, mDay);
       }
       return null;
    }
    

    希望它有所帮助,使用它并且效果很好。

    示例来自

    http://developer.android.com/guide/tutorials/views/hello-datepicker.html

    【讨论】:

    • 如何在 Fragment 中使用它?
    【解决方案2】:
    public class dateresult extends Activity
    {
    private TextView tvdisplaydate;
    private DatePicker dpResult;
    private Button bntchangedate;
    
    private int year;
    private int month;
    private int day;
    static final int DATE_DIALOG_ID = 999;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.result);
        setCurrentdateonView();
        addListenerOnButton();
    
         }
                  public void setCurrentdateonView(){
    
                      tvdisplaydate = (TextView)findViewById(R.id.tvdate);
                      dpResult = (DatePicker) findViewById(R.id.dpResult);
    
                      final Calendar c = Calendar.getInstance();
                      year = c.get(Calendar.YEAR);
                      month = c.get(Calendar.MONTH) ;
                      day = c.get(Calendar.DAY_OF_MONTH);
    
                      tvdisplaydate.setText(new StringBuffer()                   .append(month+1).append("-").append(day).append("-").append(year).append(""));
                      dpResult.init(year, month, day, null);                                  
                  }             
                 public void addListenerOnButton(){                  
                     bntchangedate = (Button)findViewById(R.id.bntchangedate);
                     bntchangedate.setOnClickListener(new OnClickListener() {
    
                        @Override
                        public void onClick(View v) {
                            // TODO Auto-generated method stub
                        showDialog(DATE_DIALOG_ID);
    
                        }
                    });              
                 }                
                 @Override
                protected Dialog onCreateDialog(int id) {
                    // TODO Auto-generated method stub
                     switch(id){
    
                     case DATE_DIALOG_ID:
                         return new DatePickerDialog(this,datePickerLisner,year,month,day);
    
                     }
                    return null;
                }                
                 private DatePickerDialog.OnDateSetListener datePickerLisner = new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker view, int Selectyear,int Selectmonth, int Selectday) {
                        year= Selectyear;
                        month= Selectmonth;
                        day = Selectday;
                        tvdisplaydate.setText(new StringBuilder() 
                        .append(Selectmonth+1).append("-").append(Selectday).append("-").append(Selectyear).append(""));
                                dpResult.init(year, month, day, null);                  
                    }
                };
    }
    
    
    <?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:orientation="vertical" >
    
    <Button
        android:id="@+id/bntchangedate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Change Date" />
    
    <TextView
        android:id="@+id/lbldate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Current Date (M-D-YYYY) :" 
        android:textAppearance="?android:attr/textAppearanceLarge"/>
    
    <TextView
        android:id="@+id/tvdate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceLarge" />
    <DatePicker
        android:id="@+id/dpResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    【讨论】:

      【解决方案3】:

      这是一个更新版本,它记录了与支持库的向后兼容性:

      http://developer.android.com/guide/topics/ui/controls/pickers.html#DatePicker

      【讨论】:

        【解决方案4】:
        public class DatePickerDialogFragment extends DialogFragment{
            //ResidenceActivity date = new ResidenceActivity();
            Handler mHandler ;
            int mDay;
            int mMonth;
            int mYear;
        
            public DatePickerDialogFragment(Handler h){
                /** Getting the reference to the message handler instantiated in MainActivity class */
                mHandler = h;
            }
        
            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState){
        
                /** Creating a bundle object to pass currently set date to the fragment */
                Bundle b = getArguments();
        
                /** Getting the day of month from bundle */
                mDay = b.getInt("set_day");
        
                /** Getting the month of year from bundle */
                mMonth = b.getInt("set_month");
        
                /** Getting the year from bundle */
                mYear = b.getInt("set_year");
        
                /** DatePickerDialog's "Set" click listener */
                DatePickerDialog.OnDateSetListener listener  = new DatePickerDialog.OnDateSetListener() {
                 //   @Override
                    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                        mDay = dayOfMonth;
                        mMonth = monthOfYear;
                        mYear = year;
        
                        /** Creating a bundle object to pass currently set date to the fragment */
                        Bundle b = new Bundle();
        
                        /** Adding currently set day to bundle object */
                        b.putInt("set_day", mDay);
        
                        /** Adding currently set month to bundle object */
                        b.putInt("set_month", mMonth);
        
                        /** Adding currently set year to bundle object */
                        b.putInt("set_year", mYear);
        
                        /** Adding Current date in a string to bundle object */
                        b.putString("set_date", Integer.toString(mDay) + "/" + Integer.toString(mMonth+1) + "/" + Integer.toString(mYear));
        
                        /** Creating an instance of Message */
                        Message m = new Message();
        
                        /** Setting bundle object on the message object m */
                        m.setData(b);
        
        
        
                        /** Message m is sending using the message handler instantiated in MainActivity class */
                        mHandler.sendMessage(m);
        
        
        
        
                    }
                };
        
                /** Opening the DatePickerDialog window */
                return new DatePickerDialog(getActivity(), listener, mYear, mMonth, mDay);
            }
        }
        

        【讨论】:

        • 对不起,我看到了这个,不得不提供一些反馈。 1. 构造函数中的处理程序啊啊啊!!!?不,永远不要将构造函数与生命周期组件一起使用。 2. Bundle值请使用常量,不易出错。 3. 处理程序有点像 hack,如果您的活动是生命周期的,它将无法工作。所以也许寻找更好的方法来解决这个问题。
        • 使用它有什么问题(处理程序)?
        【解决方案5】:

        接受的答案不处理用户在日期选择器中单击取消。在这种情况下,不应更新任何内容。

        我想要和 OP 一样的东西,但我只是想要它内嵌。这是我使用的:

        创建将在单击日期选择器确定按钮时调用的回调:

        public void datePicked(int year, int month, int day) {
            buttonDate.setText(String.valueOf(year) + "/" + 
                  String.valueOf(month) + "/" + String.valueOf(day));
        }
        

        然后在创建按钮的方法中使用以下代码来选择日期:

            buttonDate = (Button) rootView.findViewById(R.id.button_select_date);
            buttonDate.setText("Select Date");
            buttonDate.setOnClickListener(new View.OnClickListener() {
                public void setReturnDate(int year, int month, int day) {
                    datePicked(year, month, day);
                }
        
                @Override
                public void onClick(View v) {
                    Dialog datePickerDialog = new DatePickerDialog(activity, new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        
                        }
                    }, leagueEndDate.get(Calendar.YEAR), leagueEndDate.get(Calendar.MONTH), leagueEndDate
                            .get(Calendar.DAY_OF_MONTH));
                    datePickerDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                        @Override
                        public void onDismiss(DialogInterface dialog) {
                            setReturnDate(((DatePickerDialog) dialog).getDatePicker().getYear(),
                                    ((DatePickerDialog) dialog).getDatePicker().getMonth(), ((DatePickerDialog) dialog)
                                            .getDatePicker().getDayOfMonth());
                        }
                    });
                    datePickerDialog.show();
                }
            });
        

        【讨论】:

          【解决方案6】:
          Step 1 : create a java file:
          
          package com.example.babs;
          
          import java.util.Calendar;
          
          import android.app.Activity;
          import android.app.DatePickerDialog;
          import android.app.Dialog;
          import android.app.DialogFragment;
          import android.os.Bundle;
          import android.view.View;
          import android.widget.DatePicker;
          import  android.app.FragmentManager;
          
          
          public class EditUserInfo extends Activity {
          
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.user_edit_view);
          
              }
          
              public class DatePickerFragment extends DialogFragment
              implements DatePickerDialog.OnDateSetListener {
          
          
                  // pgrm mark ---- ---- ----- ---- ---- ----- ---- ---- -----  ---- ---- -----
          
                  @Override
                  public Dialog onCreateDialog(Bundle savedInstanceState) {
                      // Use the current date as the default date in the picker
                      final Calendar c = Calendar.getInstance();
                      int year = c.get(Calendar.YEAR);
                      int month = c.get(Calendar.MONTH);
                      int day = c.get(Calendar.DAY_OF_MONTH);
          
                      // Create a new instance of DatePickerDialog and return it
                      return new DatePickerDialog(getActivity(), this, year, month, day);
                  }
          
                  public void onDateSet(DatePicker view, int year, int month, int day) {
                      // Do something with the date chosen by the user
                  }
          
              }
          
          
              public void showDatePickerDialog(View v) {
          
                  FragmentManager fragmentManager = getFragmentManager();
          
                  DialogFragment newFragment = new DatePickerFragment();
                  newFragment.show(fragmentManager, "datePicker");
              }
          
          }// end main class EditUserInfo
          
          step 2: your xml file must contain : 
          
          <?xml version="1.0" encoding="utf-8"?>
          <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@android:color/white"
              android:fillViewport="true" >
          </ScrollView>
          <Button 
              android:layout_width="wrap_content" 
              android:layout_height="wrap_content"
              android:text="@string/pick_date" 
              android:onClick="showDatePickerDialog" />
          

          【讨论】:

            【解决方案7】:

            使用:导入java.util.Calendar;

            改为:导入 android.icu.util.Calendar。

            此软件包仅支持不低于 24 级的 API。这是我们在对话框中获取日历需要用到的包,

            这很好用。

            【讨论】:

              【解决方案8】:

              要使用 DatePicker,请在您的 OnCreate of Activity 中添加以下源代码。

              PS:确保为您的 EditText 提供 android:focusable="false"

              // Edittext in your layout file
              date = (EditText) findViewById(R.id.date);
              // onclick on edit text
              date.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  final Calendar c = Calendar.getInstance();
                  int mYear = c.get(Calendar.YEAR); // current year
                  int mMonth = c.get(Calendar.MONTH); // current month
                  int mDay = c.get(Calendar.DAY_OF_MONTH); // current day
                  // date picker dialog
                  datePickerDialog = new DatePickerDialog(MainActivity.this,
                       new DatePickerDialog.OnDateSetListener() {
              
                               @Override
                               public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                                   // set day of month , month and year value in the edit text
                                   date.setText(dayOfMonth + "/"+ (monthOfYear + 1) + "/" + year);
                               }
                       }, mYear, mMonth, mDay);
                              datePickerDialog.show();
                  }
              });
              

              当您单击 Edittext 时,它将打开日历。

              【讨论】:

                猜你喜欢
                • 2014-08-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多