2015-01-18 2 views
-2

Я использую datePickerDialog в своем приложении. Я поставил текущую дату и onClickListener как на той же textViewDatePickerDialog сбрасывает дату в Android

Первоначально TextView отображает текущую дату и когда он прослушивает нажмите событие, он показывает DatePickerDialog

Что такое моя проблема?

Когда я нажимаю на textView он показывает мне DatePicker с текущей датой, то я установить любую дату, новая дата теперь видна на TextView но каждый раз, когда я нажимаю на TextView он показывает текущую дату в datePickerDialog , Я хочу, чтобы datepicker обновил и на datePickerDialog также.

Вот мой Activity.java сниппет

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

//format of the current date 
String currDate = new SimpleDateFormat("MM/dd/yyyy").format(new Date()); 

//set current date on textView 
dateView = (TextView) findViewById(R.id.date_view); 
dateView.setText(currDate); 

dateView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     DatePickerDialog dpd = new DatePickerDialog(TRTimeReminder.this, 
       new DatePickerDialog.OnDateSetListener() { 
        @Override 
        public void onDateSet(DatePicker view, int year, int month, int day) { 
         c.set(year, month, day); 
         String date = new SimpleDateFormat("MM/dd/yyyy").format(c.getTime()); 
         dateView.setText(date); 
        } 
       }, mYear, mMonth, mDay); 
      dpd.show(); 
     } 
    }); 

Редактировать

Я также обновил DatePickerDialog(TRTimeReminder.this,.....,mYear, mMonth, mDay) к DatePickerDialog(TRTimeReminder.this,....., y, m, d)

где int y, m, d переменные I, определенные внутри onDateSet() способом, как y = year, m = month, d = day, но когда я нажимаю TextView он показывает инициализируется дата JAN 1 1900

ответ

1

Вы инициализируете dpd с mYear, mMonth, mDay, насколько я вижу, вы никогда не обновляете их.

Обновления в отношении комментариев:

вытягивать данные из Calendar c при инициализации нового DatePickerDialog вместо использования сохраненных значений.

DatePickerDialog dpd = new DatePickerDialog(TRTimeReminder.this, 
    new DatePickerDialog.OnDateSetListener() { 
     @Override 
     Public void onDateSet(DatePicker view, int year, int month, int day) { 
     c.set(year, month, day); 
     String date = new SimpleDateFormat("MM/dd/yyyy").format(c.getTime()); 
     dateView.setText(date); 
     } 

     c.get(Calender.YEAR); // I forgot if you need the ; here when using Java 
     c.get(Calender.MONTH; 
     c.get(Calender.DAY_OF_MONTH); 
}); 
+0

Я также попытался изменить его. Я взял 'int y, m, d' и определил переменные внутри' onDateSet', то есть 'y = year'' m = month' 'd = date', а затем положил' y, m, d' вместо 'mYear, mMonth , mDay'. Но когда я нажимаю на 'textView' для выбора даты, он инициализирует дату ** JAN 1 1900 ** – Apurva

+0

Не уверен, что я понимаю изменение, которое вы описываете. Насколько я вижу вашу проблему, вы берете дату из календаря c и сохраняете ее, когда вы обновляете дату в c, вы никогда не изменяете эти сохраненные значения, а затем, когда вы открываете новый DatePickerDialog, вы используете старое значение , Почему бы не инициализировать c.get (Calendar.YEAR); вместо mYear? – Chewie

+0

не могли бы вы объяснить в своем ответе – Apurva

0

OnDateSet вызывается после того, как пользователь установил дату. Если вы хотите показать предыдущую дату в диалоговом окне, вы должны сначала вызвать onCreateDialog и установить дату. См. Пример кода ниже:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) 
{ 
int year = 0; 
int month = 0; 
int day = 0; 

// get previous date if available 
String dateFormatted = dateView.getText(); 
Log.i(TAG, "What is the user's date " + dateFormatted); 

if (dateFormatted == null || dateFormatted.isEmpty()) 
{ 
    // Use the current date as the default date in the picker 
    final Calendar c = Calendar.getInstance(); 
    year = c.get(Calendar.YEAR); 
    Log.i(TAG, "what is the phone's year: " + year); 
    month = c.get(Calendar.MONTH); 
    Log.i(TAG, "what is the phone's month: " + month); 
    day = c.get(Calendar.DAY_OF_MONTH); 
    Log.i(TAG, "what is the phone's day: " + day); 
} else 
{ 
    day = Integer.parseInt(dateFormatted.substring(0, 2)); 
    Log.i(TAG, "what is the user's day: " + day); 
    month = Integer.parseInt(dateFormatted.substring(3, 5)); 
    // Correct month to 0-11 format from 1-12 format 
    month = month - 1; 
    Log.i(TAG, "what is the user's month: " + month); 
    year = Integer.parseInt(dateFormatted.substring(6, 10)); 
    Log.i(TAG, "what is the user's year: " + year); 
} 

// Create a new instance of DatePickerDialog and return it 
return new DatePickerDialog(getActivity(), this, year, month, day); 
} 

N.B. Я использую DialogFragment, который реализует DatePickerDialog.OnDateSetListener. Таким образом, вам может потребоваться изменить getActivity на это. Я полагаю, что это сработает.

Затем используйте onDateSet:

public void onDateSet(DatePicker view, int year, int month, int day) 
{ 
// Do something with the date chosen by the user 
Time time = new Time(); 
time.set(day, month, year); 
String date = time.format("%d-%m-%Y"); 
Log.i(TAG, "The date you are setting: " + date); 
dateView.setText(date); 
Log.i(TAG, "You have set the date to: " + date); 
} 
1

Я не думаю, что ваш код оптимизирован или корректными по нескольким причинам:

  1. Каждое событие щелчка у вас есть новый экземпляр Date Picker.
  2. Я не думаю, что вы даже отклонили предыдущий выбор даты, даже тогда этот код серьезно в плохом состоянии.
  3. После установки текущей даты вы никогда не будете повторно инициализировать переменные-члены mYear, mMonth, mDay с новыми значениями.

Исправьте код -

DatePickerDialog dpd = new DatePickerDialog(TRTimeReminder.this, 
    new DatePickerDialog.OnDateSetListener() { 
     @Override 
     Public void onDateSet(DatePicker view, int year, int month, int day) { 
      mYear = year; 
      mMonth = month; 
      mDay = day; 
      // Perform your operation 
     } 

}, mYear, mMonth, mDay); 

согласно моему предложению, я предпочел бы реализации ниже кода: -

public class CustomDatePicker extends DialogFragment implements DatePickerDialog.OnDateSetListener { 

    private static final String CUSTOM_DIALOG_TAG="custom_dialog"; 

    public static void showDialog(FragmentManager fm){ 
     FragmentTransaction ft = fm.beginTransaction(); 
     CustomDatePicker mPrveInstance = (CustomDatePicker)fm.findFragmentByTag(CUSTOM_DIALOG_TAG); 
     if (mPrveInstance != null) { 
      ft.remove(mPrveInstance); 
     } 
     ft.addToBackStack(null); 
     // Create and show the dialog. 
     CustomDatePicker datePicker = new CustomDatePicker(); 
     datePicker.show(ft, CUSTOM_DIALOG_TAG); 
    } 
    @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); 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     // Create Interface and send callback to activity to call show 
     // Avoid exposing dialog fragment instance to activity 
     Calendar.getInstance().set(year, month, day); 
    } 

} 

От активности непосредственно вызвать метод показа всякий раз, когда вы хотите, чтобы показать его.

// CustomDatePicker.showDialog(getFragmentManager()); 
+0

Я не использую 'FragmentManager' – Apurva

+0

. Ваш выбор - не использовать диспетчер фрагментов, но я предпочитаю его таким образом. Я уже объяснил, если вы хотите использовать, не создавайте несколько экземпляров при каждом обратном вызове. –