NullPointerException beim Setzen von Text auf EditText - onDateSet
-
20-12-2019 - |
Frage
Ich habe einen EditText, in dem beim Klicken des Benutzers ein Datumsdialogfeld angezeigt wird und beim Festlegen des Datums das Datum im EditText-Feld angezeigt werden sollte.Obwohl einfach genug, kann ich nicht finden, warum ich eine Nullzeiger-Ausnahme bekomme.Ich habe verschiedene Möglichkeiten ausprobiert und meinen Code viel geändert, aber nichts funktioniert.Hier ist es eines der Konzepte meines Codes:
Klasse starten:
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");
}
}
Datumsauswahl Klasse:
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);
}
}
auch 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>
Ich hatte es mit einer anderen Methode zum Laufen gebracht, aber es ist veraltet und ich möchte es nicht verwenden.DialogFragments scheint der richtige Weg zu sein.
BEARBEITEN:
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)
Lösung
Es ist, weil Sie editText = (EditText) view.findViewById(R.id.etDepDate);
verwenden.FindViewByID gibt null in diesem Fall zurück, da Edittstext kein Kind der Datumspicker-Ansicht ist.
Wenn der EDITTEXT Teil der Inhaltsansicht Ihrer Aktivität ist, können Sie dies verwenden:
editText = (EditText) getActivity().findViewById(R.id.etDepDate);
Dies ist übrigens nicht wirklich gut.Vorzugsweise würden Sie einen externen Ondatesetlistener an das Fragment weitergeben.
Andere Tipps
Diese Zeile
editText = (EditText) view.findViewById(R.id.etDepDate);
gibt Ihnen einen Fehler, da Sie Ihren nicht finden können EditText
in DatePicker
.Sie müssen Ihre passieren EditText
im Konstruktor für DatePick
oder geben Sie den Wert irgendwie in seiner ursprünglichen Form an ihn zurück Activity
Erstellen Sie einen Konstruktor für Ihre Datusspicker-Klasse und geben Sie den EDITTEXT dazu an. Zum Beispiel:
generasacodicetagpre.und verwenden Sie sie dann einfach in der generakodicetagcode-Methode.
Verwendung
generasacodicetagpre.statt
generasacodicetagpre.weil Sie in Ihrem DATEPICK-Dialog nicht mehr Edittext haben. Aus diesem Grund ist nur findViewByID () zurückzugeben ..
Was ist, wenn Sie Ansicht von dieser Funktion entfernen?
generasacodicetagpre.Sie können nicht zugreifen EditText
inneren DatePick
Klasse.Sie müssen den Text zurücksenden an Start
von DatePick
Klasse.du kannst es so machen.
Definieren Sie eine Schnittstelle und Callback-Methode in
DatePick
Klasse.callbackListener listener; interface callbackListener { public void setText(String text); }
Implementieren Sie die Schnittstelle in
Start
Klasse.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
methode vonDatePick
klasse weist dem Schnittstellenobjekt die ursprüngliche Aktivität zu.@Override public void onAttach(Activity activity) { super.onAttach(activity); listener = (callbackListener) activity; }
4.Rufen Sie die Callback-Methode in auf onDateSet
methode und übergeben Sie den Text
public void onDateSet(DatePicker view, int year, int month, int day) {
listener.setText(day + "/" + month + "/" + year);
}
Da sich Ihr EDITTEXT in Fragment-Aktivität befindet und nicht im Dialogfragment Datumspicker, können Sie auf diese Weise nicht direkt auf ihn zugreifen.Erstellen Sie einen Verweis auf Ihre Fragment-Aktivität und greifen Sie durch ein Verfahren zu.Erklären Sie den Umfang von EDITTEXT, um in dieser Tätigkeit aufgerufen zu werden.Dann,
generasacodicetagpre.und rekonstruieren Sie einfach Ihre Dialogfragment-Ondateset-Methode so.
generasacodicetagpre.