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)
War es hilfreich?

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.

  1. Definieren Sie eine Schnittstelle und Callback-Methode in DatePick Klasse.

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

    }

  3. In onAttach methode von DatePick 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top