android - fecha - Abrir un DatePickerDialog al hacer clic en EditText toma dos clics
edittext datepicker android (14)
Agregue esto a su archivo xml EditText:
android:clickable="false"
android:cursorVisible="false"
android:focusable="false"
android:focusableInTouchMode="false">
De esta manera funcionará como una vista de texto.
Quiero abrir un calendario al hacer clic en Editar texto. Después de eso quiero establecer la fecha que el usuario selecciona del calendario en el texto de edición. El problema es que, solo cuando hago clic en EditText por segunda vez, se abre el calendario. Ayúdame a resolver el problema ( why calendar don''t open for the first time
).
Código XML de texto editado
<EditText
android:id="@+id/dateofBirth"
android:layout_width="290dp"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp"
android:maxLines="1"
android:hint="dd/mm/yyyy" />
Código de actividad
public void informationPopUp() {
final Dialog dialog= new Dialog(MainActivity.this,R.style.Dialog_Fullscreen);
dialog.setContentView(R.layout.details_dialog);
dateofBirth = (EditText)dialog.findViewById(R.id.dateofBirth);
dialog.show();
myCalendar = Calendar.getInstance();
final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateLabel();
}
};
dateofBirth.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(DATE_DIALOG_ID);
}
});
}
private void updateLabel() {
String myFormat = "MM/dd/yy"; //In which you need put here
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
dateofBirth.setText(sdf.format(myCalendar.getTime()));
}
protected Dialog onCreateDialog(int id) {
final Calendar now = Calendar.getInstance();
switch (id) {
case DATE_DIALOG_ID:
// set date picker as current date
DatePickerDialog _date = new DatePickerDialog(this, date,myCalendar
.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)){
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth){
if (year > now.get(Calendar.YEAR))
view.updateDate(myCalendar
.get(Calendar.YEAR), myCalendar
.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
if (monthOfYear > now.get(Calendar.MONTH) && year == now.get(Calendar.YEAR))
view.updateDate(myCalendar
.get(Calendar.YEAR), myCalendar
.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
if (dayOfMonth > now.get(Calendar.DAY_OF_MONTH) && year == now.get(Calendar.YEAR) &&
monthOfYear == now.get(Calendar.MONTH))
view.updateDate(myCalendar
.get(Calendar.YEAR), myCalendar
.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
}
};
return _date;
}
return null;
}
No estoy entendiendo lo que he hecho mal. Por favor sugiera una solución.
Agregue esto en su EditText
android:editable="false"
android:focusable="false"
Agregue esto en su texto de edición para abrir el selector de fecha al primer clic. android:focusable="false"
En el archivo layout.xml, agregue la propiedad android:focusable=false
, esto seguramente funcionará
En tu xml, establece el enfocable en falso
android:focusable="false"
Intentaré abordar su problema, pero no estoy completamente seguro de la primera razón.
La apertura del calendario solo en el segundo clic es porque está utilizando un texto de edición. En el primer clic, su texto de edición se centrará. luego el segundo clic solo llama al onClickListener.
Si no desea editar el ajuste de la fecha manualmente (usando el teclado), ¿por qué no usar un TextView para mostrar la fecha seleccionada?
El problema con la fecha que no se actualiza en editText está ocurriendo porque no está configurando DateSetListener en su código. Debe configurarlo para notificar al sistema que se estableció una Fecha. El agente de escucha DateChange solo devuelve la fecha mientras está cambiando la fecha, y no parece que esté configurando la fecha en el texto de edición.
Prueba este código:
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
DatePickerDialog datePicker = new DatePickerDialog(this,
R.style.AppBlackTheme,
datePickerListener,
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH),
cal.get(Calendar.DAY_OF_MONTH));
datePicker.setCancelable(false);
datePicker.setTitle("Select the date");
return datePicker;
}
} catch (Exception e) {
showMsgDialog("Exception",
"An error occured while showing Date Picker/n/n"
+ " Error Details:/n" + e.toString(), "OK");
}
return null;
}
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) {
String year1 = String.valueOf(selectedYear);
String month1 = String.valueOf(selectedMonth + 1);
String day1 = String.valueOf(selectedDay);
TextView tvDt = (TextView) findViewById(R.id.tvDate);
tvDt.setText(day1 + "/" + month1 + "/" + year1);
}
};
En esto, estoy actualizando la fecha a un TextView con el ID "tvDate". Aconsejo usar un TextView en lugar de EditText y pruebe este código.
Actualizar
Si necesita utilizar EditText y cargar el calendario en el primer clic, intente configurar onFocusListner en editText en lugar de onClickListner.
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) {
// Show your calender here
} else {
// Hide your calender here
}
}
});
Primero define estas variables en tu actividad.
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.Log;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TimePicker;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class MainActivity extends Activity {
private int mYear, mMonth, mDay, mHour, mMinute;
luego usa estos métodos:
1) para el selector de FECHA abierto
public void openDatePicker() {
// Get Current Date
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
//launch datepicker modal
DatePickerDialog datePickerDialog = new DatePickerDialog(this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Log.d(APIContanst.LOG_APP, "DATE SELECTED "+dayOfMonth + "-" + (monthOfYear + 1) + "-" + year);
//PUT YOUR LOGING HERE
//UNCOMMENT THIS LINE TO CALL TIMEPICKER
//openTimePicker();
}
}, mYear, mMonth, mDay);
datePickerDialog.show();
}
2) para el selector de tiempo abierto modal
public void openTimePicker() {
// Get Current Time
final Calendar c = Calendar.getInstance();
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
//launch timepicker modal
TimePickerDialog timePickerDialog = new TimePickerDialog(this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Log.d(APIContanst.LOG_APP, "TIME SELECTED "+hourOfDay + "-" + minute + "-");
//PUT YOUR LOGIC HERE
}
}, mHour, mMinute, false);
timePickerDialog.show();
}
también puede combinar los dos métodos para abrir el selector de tiempo después de cerrar el selector de fecha.
Estas funciones no necesitan usar un plugin
Prueba este código 100% funciona.
ESCRIBE ESTO EN ONCREADO
et_dob.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DATE_DIALOG_ID);
}
});
final Calendar calendar = Calendar.getInstance();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
if (et_dob.getText().toString() != null) {
try {
calendar.setTime(df.parse(et_dob.getText().toString()));
} catch (java.text.ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
mYear = calendar.get(Calendar.YEAR);
mMonth = calendar.get(Calendar.MONTH);
mDay = calendar.get(Calendar.DAY_OF_MONTH);
SimpleDateFormat month_date = new SimpleDateFormat("MMM");
month = month_date.format(calendar.getTime());
} else {
mYear = calendar.get(Calendar.YEAR);
mMonth = calendar.get(Calendar.MONTH);
mDay = calendar.get(Calendar.DAY_OF_MONTH);
SimpleDateFormat month_date = new SimpleDateFormat("MMM");
month = month_date.format(calendar.getTime());
}
if (cal_currentTime.compareTo(calendar) > 0)
updateDisplay();
Y PEGUE CÓDIGO RESTANTE EN SU CLASE
static final int DATE_DIALOG_ID = 1;
private int mYear;
private int mMonth;
private int mDay;
private String month;
private String dateOfBirth;
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
mDay);
}
return null;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
switch (id) {
case DATE_DIALOG_ID:
((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay);
break;
}
}
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
String dateSetter = (new StringBuilder().append(mYear).append("-")
.append(mMonth + 1).append("-").append(mDay).append(""))
.toString();
final Calendar cal = Calendar.getInstance();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
if (dateSetter != null) {
try {
cal.setTime(df.parse(dateSetter));
} catch (java.text.ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
SimpleDateFormat month_date = new SimpleDateFormat("MMM");
month = month_date.format(cal.getTime());
}
if (cal_currentTime.compareTo(cal) > 0)
updateDisplay();
else
Toast.makeText(context, "Choose Proper date format",
Toast.LENGTH_SHORT).show();
}
};
cargarlo para editar texto
private void updateDisplay() {
dateOfBirth = (new StringBuilder()
// Month is 0 based so add 1
.append(mYear).append("-").append(mMonth + 1).append("-")
.append(mDay).append("")).toString();
et_dob.setText(new StringBuilder()
// Month is 0 based so add 1
.append(mDay).append("-").append(month).append("-")
.append(mYear));
}
Solo haz esto
//Open the DatePicker dialgo in one click and also hide the soft keyboard.
youEditText.setInputType(InputType.TYPE_NULL);
youEditText.requestFocus();
Solo usa esto en tu EditText
android:focusable="false"
Use setOnFocusChangeListener en lugar de OnCLickListner. El siguiente código es un ejemplo que estoy usando para el mismo propósito.
editText_dob.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
hideSoftKeyboard(RegisterationActivity.this);
editText_dob.setRawInputType(InputType.TYPE_CLASS_TEXT);
setDate(editText_dob);
}
}
});
lo primero, agrega android:focusable="false"
en xml. En el código java, solo establece un evento:
case R.id.edt_d_o_birth: {
KeyboardUtils.hideSoftKeyboard(this);
Calendar calendar = Calendar.getInstance(Locale.getDefault());
DatePickerDialog datePickerDialog = new DatePickerDialog(RegisterActivity.this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
//todo
}
},calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));
datePickerDialog.show();
break;
}
Código de trabajo 100%
Implementar implements View.OnClickListener
Dentro de onCreate YourEditText.setOnClickListener(this);
@Override
public void onClick(View v) {
if (v == YourEditText) {
// Get Current Date
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
YourEditText.setText(dayOfMonth + "-" + (monthOfYear + 1) + "-" + year);
}
}, mYear, mMonth, mDay);
datePickerDialog.show();
}
}
public class MainActivity extends Activity {
private Calendar cal;
private int day;
private int month;
private int year;
private EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et= (EditText) findViewById(R.id.edittext1);
cal = Calendar.getInstance();
day = cal.get(Calendar.DAY_OF_MONTH);
month = cal.get(Calendar.MONTH);
year = cal.get(Calendar.YEAR);
et.setText(day+"/"+month+"/"+"/"+year);
et.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
DateDialog();
}
});
}
public void DateDialog(){
OnDateSetListener listener=new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth)
{
et.setText(dayOfMonth+"/"+monthOfYear+"/"+year);
}};
DatePickerDialog dpDialog=new DatePickerDialog(this, listener, year, month, day);
dpDialog.show();
}
}