NullPointerException quando setText per EditText - onDateSet
-
20-12-2019 - |
Domanda
Ho un editText, dove quando l'utente fa clic su di esso, una data finestra di Dialogo viene visualizzata quando si imposta la data, la data dovrebbe essere visualizzato nella editText campo.Anche se abbastanza semplice, posso 't trovare il motivo per cui ho un nullPointer Exception.Ho provato in diversi modi e cambiato il mio codice un sacco, ma non funziona niente.Qui è uno dei concetti del mio codice:
Avviare classe:
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");
}
}
DatePick Classe:
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);
}
}
anche 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>
Avevo fatto il lavoro con un altro metodo, ma è deprecato e io don 't desidera utilizzare.DialogFragments sembra il modo giusto per farlo.
EDIT:
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)
Soluzione
È perché stai usando editText = (EditText) view.findViewById(R.id.etDepDate);
.FindviewByID ritorna NULL in questo caso perché EdiText non è un figlio della vista Datepicker.
Se l'editext fa parte della vista del contenuto della tua attività è possibile utilizzare questo:
editText = (EditText) getActivity().findViewById(R.id.etDepDate);
Questa non è davvero una buona pratica a proposito.Preferibilmente passerai un ondatetListener esterno al frammento.
Altri suggerimenti
Questa riga
editText = (EditText) view.findViewById(R.id.etDepDate);
.
Ti sta dando errore come non riesci a trovare il EditText
in DatePicker
.Avrai bisogno di passare il tuo EditText
nel costruttore per DatePick
o in qualche modo passare il valore ad esso nel suo Activity
originale
Crea un costruttore per la tua classe Datepicker e passare l'editext ad esso. Ad esempio:
public DatePickerFragment (EditText editText) {
this.editText = editText;
}
.
e quindi semplicemente usarlo nel metodo onDateSet()
.
Usa
editText = (EditText) getActivity().findViewById(R.id.etDepDate);
.
invece di
editText = (EditText) view.findViewById(R.id.etDepDate);
.
Poiché, non hai editext nella tua finestra di dialogo del tuo datepick. A causa di questo solo scoperto ViewbyId () restituendo NULL ..
Cosa succede se rimuovi la vista da questa funzione?
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);
}
. È possibile accedere EditText
all'interno DatePick
classe.È necessario inviare il testo Start
da DatePick
classe.è possibile farlo in questo modo.
Definire un'interfaccia e un metodo di callback in
DatePick
classe.callbackListener listener; interface callbackListener { public void setText(String text); }
Implementare l'interfaccia in
Start
classe.class Start extends FragmentActivity implements DatePick.callbackListener { ..... @Override public void setText(String text) { EditText editText = (EditText) view.findViewById(R.id.etDepDate); editText.setText(text);
}
In
onAttach
metodo diDatePick
classe assegnare attività originale per l'interfaccia di un oggetto.@Override public void onAttach(Activity activity) { super.onAttach(activity); listener = (callbackListener) activity; }
4.Chiamare il metodo di callback in onDateSet
metodo e passare il testo
public void onDateSet(DatePicker view, int year, int month, int day) {
listener.setText(day + "/" + month + "/" + year);
}
Poiché il tuo editext è in attività framment e non nella finestra di dialogo Datepicker non è possibile accedervi direttamente in questo modo.Prova a creare un riferimento all'attività del frammento e accedervi tramite un metodo.Dichiarare la portata di Edittoxt ad essere accessibile in questa attività.Quindi,
public void setDate(String Dte){
editText.setText(Dte);
}
.
E ricostruisci il tuo metodo OnDatet di dialogo come questo.
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);
}
.