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)
¿Fue útil?

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.

  1. Definir una interfaz y un método de devolución de llamada en DatePick clase.

    callbackListener listener;
    
    interface callbackListener {
    public void setText(String text);
    }
    
  2. 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);
    

    }

  3. En onAttach método de DatePick 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);
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top