如何从Android日期选择器获取日期?

5
我正在使用DatePicker来进行应用程序开发,我想获取我所选的日期(在DatePicker上),但是它没有返回所选的日期,而是一直返回当前日期。如何从DatePicker中获取所选日期?
任何帮助将不胜感激。
    day = pickDate.getDayOfMonth();
    month = pickDate.getMonth() + 1;
    year = pickDate.getYear();
    readAndChoose = (Button) findViewById(R.id.btnReadAndChoose);
    readAndChoose.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            Context context = getApplicationContext();
            CharSequence text = "" + day + "-" + "" + month + "-" + ""
                    + year;
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();

            /*
             * Intent i = new Intent(BirthActivity.this,
             * CompassActivity.class); startActivity(i);
             */

        }

    });

我不想创建一个 DatePicker 对话框,但我想使用 Android 提供的 DatePicker。

请在原帖中更新您当前正在使用的代码。 - Siddharth Lele
你需要为你的日期选择器设置监听器,当事件触发时获取日期,使用onDateSetListener。 - Pragnani
如何为日期选择器设置监听器。 - user2147892
日期选择器和日期选择对话框之间有什么区别吗? - user2147892
你能发布你的日期选择器代码吗? - Raghunandan
8个回答

4
private DatePickerDialog.OnDateSetListener datePickerListener 
                = new DatePickerDialog.OnDateSetListener() {

        // when dialog box is closed, below method will be called.
        public void onDateSet(DatePicker view, int selectedYear,
                int selectedMonth, int selectedDay) {
            year = selectedYear;
            month = selectedMonth;
            day = selectedDay;

            // set selected date into textview
            tvDisplayDate.setText(new StringBuilder().append(month + 1)
               .append("-").append(day).append("-").append(year)
               .append(" "));

            // set selected date into datepicker also
            dpResult.init(year, month, day, null);

        }
    };

请参考以下链接,这可能会对你有所帮助:- http://www.mkyong.com/android/android-date-picker-example/


2
有两种方法可以实现:
  1. Using init() method of the DatePicker passing in OnDateChangedListener.

       datePicker.init(
            datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(),
            new DatePicker.OnDateChangedListener() {
                @Override
                public void onDateChanged(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
                    selectedYear = year;
                    selectedMonth = monthOfYear;
                    selectedDayOfMonth = dayOfMonth;
                    Log.d(LOG_TAG, "selectedDate = " + selectedYear  + "-" + selectedMonth + "-" + selectedDayOfMonth );
                   //TODO save or use selected value here
                }//end onDateChangedListener
    
    });
    
  2. Having a Button click or overriding onPause to get currently selected date when a certain action is to be taken or when user is leaving the screen.

    @Override
    public void onPause() {
        int selectedYear = datePicker.getYear();
        int selectedMonth = datePicker.getMonth();
        int selectedDay =  datePicker.getDayOfMonth();
        //TODO save or use selected value here
    }
    

2
 public class pickerdate extends Activity {
 /** Called when the activity is first created. */
 private TextView mDateDisplay;
 private Button mPickDate;
 private int mYear;
 private int mMonth;
 private int mDay;

 static final int DATE_DIALOG_ID = 0;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    mDateDisplay = (TextView) findViewById(R.id.dateDisplay);
    mPickDate = (Button) findViewById(R.id.pickDate);


    mPickDate.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            showDialog(DATE_DIALOG_ID);
        }
    });


    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);

    updateDisplay();
}
private void updateDisplay() {
    mDateDisplay.setText(
        new StringBuilder()
                // Month is 0 based so add 1
                .append(mMonth + 1).append("-")
                .append(mDay).append("-")
                .append(mYear).append(" "));
}
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();
        }
    };
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DATE_DIALOG_ID:
            return new DatePickerDialog(this,
                        mDateSetListener,
                        mYear, mMonth, mDay);
        }
        return null;
    }
 }

主布局文件

  <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:orientation="vertical">
 <TextView android:id="@+id/dateDisplay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""/>
 <Button android:id="@+id/pickDate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Date Picker"/>
  </LinearLayout>

上述代码可行。希望这正是您所寻找的。

我不想使用单独的对话框,而是想使用安卓提供的日期选择器。 - user2147892
注意:此方法已不再使用。您应该考虑使用DatePickerFragment而不仅仅是对话框 - Raghunandan

1

我觉得这就是你所需要的

// the call back received when the user "sets" the date in the dialog
private DatePickerDialog.OnDateSetListener mDateSetListener =
    new DatePickerDialog.OnDateSetListener() {
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            mYear = year;
            mMonth = monthOfYear;
            mDay = dayOfMonth;

        }
};

0
你的错误在于你应该在OnclickListener事件中验证你的日期、月份和年份,检查编辑后的代码。我曾经遇到过类似的错误。
readAndChoose = (Button) findViewById(R.id.btnReadAndChoose);
readAndChoose.setOnClickListener(new OnClickListener() {


day = pickDate.getDayOfMonth();
month = pickDate.getMonth() + 1;
year = pickDate.getYear();

    @Override
    public void onClick(View arg0) {

        Context context = getApplicationContext();
        CharSequence text = "" + day + "-" + "" + month + "-" + ""
                + year;
        int duration = Toast.LENGTH_SHORT;
        Toast toast = Toast.makeText(context, text, duration);
        toast.show();

        /*
         * Intent i = new Intent(BirthActivity.this,
         * CompassActivity.class); startActivity(i);
         */

    }

});

0

这里还有一个很棒的教程在这里,其中也有可供下载的源代码。

需要注意的一点是,在编译源代码时,您需要将SelectDateFragment类“静态化”以及使populateSetDate()方法静态化,并且我还将此代码移动到了onCreate()方法中:

mEdit = (EditText)findViewById(R.id.editText1);

之后,您应该能够编译代码了。

编辑后,MainActivity应该如下所示:

package com.javapapers.andoiddatepicker;
import java.util.Calendar;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.DatePicker;
import android.widget.EditText;

public class MainActivity extends FragmentActivity {

private static EditText mEdit;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mEdit = (EditText) findViewById(R.id.editText1);
}

public void selectDate(View view) {
    DialogFragment newFragment = new SelectDateFragment();
    newFragment.show(getSupportFragmentManager(), "DatePicker");
}

public static void populateSetDate(int year, int month, int day) {
    mEdit.setText(month + "/" + day + "/" + year);
}

public static class SelectDateFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {

    @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) {
        populateSetDate(year, month+1, day);
    }
}

}


0
Dj的答案是可行的。如果你想使用一个日历变量来存储日期,那么,
     public void onDateSet(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {
        setDate.set(year, monthOfYear, dayOfMonth);          

希望这能帮到你!


0
private void openCalendar() {
    DatePickerDialog dialog = new DatePickerDialog(getContext(), (view, year, month, dayOfMonth) -> {

        date = getDateString(year, month, dayOfMonth);

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

}

private String getDateString(int year, int mMonth, int mDay) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(year, mMonth, mDay);
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    return dateFormat.format(calendar.getTime());
}

1
这是一个非常低质量的答案,请改进它。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接