2017-01-02 2 views
3

Я использую следующий код для создания DatePickerDialog от EditText.autoclose DatePickerDialog

import android.widget.DatePicker; 
import android.app.DatePickerDialog; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Locale; 

Calendar myCalendar = Calendar.getInstance(); 

String myFormat = "MM/dd/yy"; 
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US); 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

EditText datePicker = (EditText) findViewById(R.id.popUpDate); 
datePicker.setText(sdf.format(myCalendar.getTime())); 

datePicker.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     new DatePickerDialog(AddAccount.this, R.style.AppTheme_Dialog, new DatePickerDialog.OnDateSetListener() { 
      @Override 
      public void onDateSet(DatePicker view, int year, int monthOfYear, 
            int dayOfMonth) { 
       myCalendar.set(Calendar.YEAR, year); 
       myCalendar.set(Calendar.MONTH, monthOfYear); 
       myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
       datePicker.setText(sdf.format(myCalendar.getTime())); 
      } 
     }, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), 
       myCalendar.get(Calendar.DAY_OF_MONTH)).show(); 
    } 
}); 
} 

Возможно ли автоматическое закрытие по умолчанию после выбора даты? Или это потребует полного римейка виджета datepicker?

+0

проверить мой ответ –

ответ

2

Создать MyPicker класс :)

import static yourPackageName.MainActivity.sdf; // get static imports 


    public class MyPicker extends DatePickerDialog { 

    Context context; 
    @Override 
    public DatePicker getDatePicker() { 
     return super.getDatePicker(); 
    } 


    public MyPicker(Context context, int themeResId, OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth) { 
     super(context, themeResId, listener, year, monthOfYear, dayOfMonth); 
     this.context = context; 
    } 

    @Override 
    public void onDateChanged(DatePicker view, int year, int month, int dayOfMonth) { 
     myCalendar.set(Calendar.YEAR, year); 
     myCalendar.set(Calendar.MONTH, month); 
     myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
     datePicker.setText(sdf.format(myCalendar.getTime())); 
     datePickerDialog.dismiss(); 
    } 
} 

Теперь предполагается, что ваш главный класс в MainActivity

public class MainActivity extends AppCompatActivity { 


    public static Calendar myCalendar = Calendar.getInstance(); 


    public static String myFormat = "MM/dd/yy"; 
    public static SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US); 
    public static EditText datePicker; 
    public static MyPicker datePickerDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     datePicker = (EditText) findViewById(R.id.popUpDate); 
     datePicker.setText(sdf.format(myCalendar.getTime())); 

     datePicker.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       datePickerDialog = new MyPicker(MainActivity.this, R.style.AppTheme_Dialog, new DatePickerDialog.OnDateSetListener() { 
        @Override 
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
        } 
       }, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH)); 
       datePickerDialog.show(); 
      } 

     }); 
    } 

} 
} 

или, если вам не нужно применять стили

public class MainActivity extends AppCompatActivity { 

    public String myFormat = "MM/dd/yy"; 
    public SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US); 
    public EditText datePicker; 
    final Calendar calendar = Calendar.getInstance(); 
    private DatePickerDialog datePickerDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     datePicker = (EditText) findViewById(R.id.popUpDate); 
     datePicker.setText(sdf.format(calendar.getTime())); 

     datePicker.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       datePickerDialog = new DatePickerDialog(MainActivity.this, null, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); 
       datePickerDialog.getDatePicker().init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() { 
        @Override 
        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
         calendar.set(Calendar.YEAR, year); 
         calendar.set(Calendar.MONTH, monthOfYear); 
         calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
         datePicker.setText(sdf.format(calendar.getTime())); 
         datePickerDialog.dismiss(); 
        } 
       }); 
       datePickerDialog.show(); 
      } 
     }); 
    } 
} 

работает как шарм!

+0

Я думаю, что это похоже на мой ответ.и с вашим 'MyPicker', Контекст, который вы определили, не используется, также не требуется fucntion getDatePicker –

+0

да, это класс, который используется, который расширяет DatePickerDialog. Удалено, поскольку я могу опубликовать его. В любом случае мы обращаемся к тому же методу метода onDateChanged, который позволяет идентифицировать изменения даты и с моей первой, я применил тему –

+0

@Charuka, можно установить «сегодняшнюю» дату через 'datePickerDialog 'как текущую дату, когда вызывается действие? Кажется, что он всегда по умолчанию выбран последним. – Leb

1

Текущее поведение в порядке?

Если это будет автоматически закрыто ...! то как система будет знать, что вы выбираете желаемую дату и время или вы случайно ее выбираете ..... там нет чувство автоматического закрытия, а не пожара события.

Но вы можете закрыть его на onDateSet.

Обновление: Вы можете закрыть его вот так.

// open datepicker dialog. 
// set date picker for current date 
// add pickerListener listner to date picker 

    DatePickerDialog dialog = new DatePickerDialog(this, pickerListener, year, month,day); 
    dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Text", new DialogInterface 
      .OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
      if (which == DialogInterface.BUTTON_NEGATIVE) { 
       // Do Stuff 
      Log.i("dialog click", "dialog negative button clicked"); 
      dialog.dismiss(); 
      } 
      } 
     }); 
    dialog.dismiss(); 
+0

Он будет закрыт, если вы выберете дату, если вы случайно ее выбрали, ее трудно будет открыть повторно. Идея заключается в том, что вы чаще выбираете правильную дату, чем случайно нажимаете ее. Таким образом, автоматическое закрытие было бы лучшим маршрутом для общего пользователя. - Проблема в том, что я не уверен, что команда для включения в 'oneDateSet' – Leb

+0

вы используете встроенный сборщик данных android или любую другую библиотеку? –

+0

Встроенный один. – Leb

2

DatePickerDialog, содержащий DatePicker. А у DatePicker есть OnDateChangedListener.
Вы можете использовать OnDateChangedListener слушатель, когда вы выбираете дату, как

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

final DatePickerDialog datePickerDialog = 
    new DatePickerDialog(YourActivity.this, null, year, month, day); 

datePickerDialog.getDatePicker() 
    .init(year, month, day, new DatePicker.OnDateChangedListener() { 
     @Override 
     public void onDateChanged(DatePicker view, int year, int monthOfYear, 
      int dayOfMonth) { 
      Toast.makeText(YourActivity.this, "day" + dayOfMonth + "-month" + monthOfYear + 1 + "-year" + year, Toast.LENGTH_SHORT).show(); 
      // dismiss the popup when choose a date 
      datePickerDialog.dismiss(); 
     } 
    }); 
datePickerDialog.show(); 

Это решение будет работать для вашего дела, но я думаю, что это не очень хорошо об опыте пользователя (UX), потому что почти Android использовать приложение по умолчанию поток DatePickerDialog

0

@Phan, попробуйте на код ниже

DatePickerDialog dialog; 

datePicker.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     dialog = new DatePickerDialog(AddAccount.this, R.style.AppTheme_Dialog, new DatePickerDialog.OnDateSetListener() { 
      @Override 
      public void onDateSet(DatePicker view, int year, int monthOfYear, 
            int dayOfMonth) { 
       myCalendar.set(Calendar.YEAR, year); 
       myCalendar.set(Calendar.MONTH, monthOfYear); 
       myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
       datePicker.setText(sdf.format(myCalendar.getTime())); 

if(dialog != null) { 
dialog.dismiss(); 
} 
      } 
     }, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), 
       myCalendar.get(Calendar.DAY_OF_MONTH)); 
dialog.show(); 
    } 
}); 
+0

OP хочет отменить диалог сразу, когда мы выберем дату, а не когда мы выберем день, а затем нажмем (или нажмите ok) –