Reputation: 15953
I am using the following code to create a DatePickerDialog
from an EditText
.
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();
}
});
}
Is it possible to have the default one automatically close after a date is chosen? Or would that require a complete remake of the datepicker
widget?
Upvotes: 4
Views: 783
Reputation: 8149
The Current behavior is fine?
If it will automatically close ...! then how system will know you pick the desired date and time or you accidentally pick it..... there no sense of close it automatically instead of event fire.
But you can close it on onDateSet
.
Update: You can close it like this.
// 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();
Upvotes: 1
Reputation: 13153
Create a MyPicker class :)
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();
}
}
now assuming your main class in 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();
}
});
}
}
}
or if you don't need to apply styles
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();
}
});
}
}
Works like a charm!
Upvotes: 1
Reputation: 1672
@Phan, Try with the below code
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();
}
});
Upvotes: 0
Reputation: 60923
DatePickerDialog containing an DatePicker. And DatePicker have OnDateChangedListener.
You can use OnDateChangedListener to listener when you choose a date like
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();
This solution will work for your case but I think it is not very good about User experience (UX) because almost Android app use default DatePickerDialog flow
Upvotes: 2