NullPointerException cuando se establece Texto en Editar Texto - onDateSet
-
20-12-2019 - |
Pregunta
Tengo un editText, donde cuando el usuario hace clic en él, aparece un cuadro de diálogo de fecha, y cuando se establece la fecha, la fecha debería aparecer en el campo editText.Aunque es bastante simple, no encuentro por qué obtengo una excepción de puntero nulo.Lo intenté de varias maneras y cambié mucho mi código, pero nada funciona.Aquí está uno de los conceptos de mi código:
Comenzar la clase:
public class Start extends FragmentActivity {
int year;
int month;
int day;
static final int DATE_DIALOG_ID = 999;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
EditText editText = (EditText) findViewById(R.id.etDepDate);
editText.setText("date");
}
public void showDatePickerDialog(View v) {
DialogFragment newFragment = new DatePick();
newFragment.show(getFragmentManager(), "datepicker");
}
}
Clase de elección de fecha:
public class DatePick extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
EditText editText;
@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) {
// Do something with the date chosen by the user
editText = (EditText) view.findViewById(R.id.etDepDate);
editText.setText(day + "/" + month + "/" + year);
}
@Override
public void show(FragmentManager manager, String tag) {
// TODO Auto-generated method stub
super.show(manager, tag);
}
}
también XML:
<EditText
android:id="@+id/etDepDate"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:ems="10"
android:focusable="false"
android:hint="@string/dhint"
android:inputType="date"
android:onClick="showDatePickerDialog" >
<requestFocus />
</EditText>
Lo hice funcionar con otro metodo, pero esta obsoleto y no quiero usarlo.DialogFragments parece la forma correcta de hacerlo.
EDITAR:
11-14 20:38:06.368: E/AndroidRuntime(31557): FATAL EXCEPTION: main
11-14 20:38:06.368: E/AndroidRuntime(31557): java.lang.NullPointerException
11-14 20:38:06.368: E/AndroidRuntime(31557): at com.xxx.mytrips.DatePick.onDateSet(DatePick.java:36)
11-14 20:38:06.368: E/AndroidRuntime(31557): at android.app.DatePickerDialog.tryNotifyDateSet(DatePickerDialog.java:148)
11-14 20:38:06.368: E/AndroidRuntime(31557): at android.app.DatePickerDialog.onClick(DatePickerDialog.java:116)
11-14 20:38:06.368: E/AndroidRuntime(31557): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
11-14 20:38:06.368: E/AndroidRuntime(31557): at android.os.Handler.dispatchMessage(Handler.java:99)
11-14 20:38:06.368: E/AndroidRuntime(31557): at android.os.Looper.loop(Looper.java:137)
11-14 20:38:06.368: E/AndroidRuntime(31557): at android.app.ActivityThread.main(ActivityThread.java:5041)
11-14 20:38:06.368: E/AndroidRuntime(31557): at java.lang.reflect.Method.invokeNative(Native Method)
11-14 20:38:06.368: E/AndroidRuntime(31557): at java.lang.reflect.Method.invoke(Method.java:511)
11-14 20:38:06.368: E/AndroidRuntime(31557): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-14 20:38:06.368: E/AndroidRuntime(31557): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-14 20:38:06.368: E/AndroidRuntime(31557): at dalvik.system.NativeStart.main(Native Method)
Solución
Es porque estás usando editText = (EditText) view.findViewById(R.id.etDepDate);
.FindViewByID devuelve nulo en este caso porque EditText no es un niño de la vista DatePicker.
Si el EDITTEXT es parte de la vista de contenido de su actividad, puede usar esto:
editText = (EditText) getActivity().findViewById(R.id.etDepDate);
Esta no es realmente buena práctica por cierto.Preferiblemente, pasaría un Listenerlistante externo al fragmento.
Otros consejos
Esta línea
editText = (EditText) view.findViewById(R.id.etDepDate);
te está dando error porque no puedes encontrar tu EditText
en DatePicker
.Necesitará aprobar su EditText
en el constructor para DatePick
o de alguna manera pasarle el valor en su original Activity
Cree un constructor para su clase DatePicker y pase el editText a él. Por ejemplo:
public DatePickerFragment (EditText editText) {
this.editText = editText;
}
y luego simplemente úselo en el método onDateSet()
.
Uso
editText = (EditText) getActivity().findViewById(R.id.etDepDate);
en lugar de
editText = (EditText) view.findViewById(R.id.etDepDate);
Porque, no tiene EditText en su diálogo DatePick .. Debido a esto solo FindViewByID () que regresa NULL ..
¿Qué sucede si elimina la vista de esta función?
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
//so instead of:
//editText = (EditText) view.findViewById(R.id.etDepDate);
//use this:
editText = (EditText) findViewById(R.id.etDepDate);
editText.setText(day + "/" + month + "/" + year);
}
no puedes acceder EditText
adentro DatePick
clase.Necesitas enviar el texto de vuelta a Start
de DatePick
clase.puedes hacerlo de esta manera.
Definir una interfaz y un método de devolución de llamada en
DatePick
clase.callbackListener listener; interface callbackListener { public void setText(String text); }
Implementar la interfaz en
Start
clase.class Start extends FragmentActivity implements DatePick.callbackListener { ..... @Override public void setText(String text) { EditText editText = (EditText) view.findViewById(R.id.etDepDate); editText.setText(text);
}
En
onAttach
método deDatePick
La clase asigna la actividad original al objeto de interfaz.@Override public void onAttach(Activity activity) { super.onAttach(activity); listener = (callbackListener) activity; }
4.Llame al método de devolución de llamada en onDateSet
método y pasar el texto
public void onDateSet(DatePicker view, int year, int month, int day) {
listener.setText(day + "/" + month + "/" + year);
}
Dado que su editText está en la actividad de fragmentos y no en la fecha de diálogo DatePicker, no puede acceder directamente de esta manera.Intente crear una referencia a su actividad de fragmentos y acceder a ella a través de un método.Declare el alcance de EditText para que se acceda a través de esta actividad.Entonces,
public void setDate(String Dte){
editText.setText(Dte);
}
y simplemente reconstruya su método de Dialogfragment OnDatSet como este.
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
((MainActivity)getActivity()).setDate(day + "/" + month + "/" + year);
}