Question

J'ai un editText, où lorsque l'utilisateur clique dessus, une boîte de dialogue de date apparaît et lorsque la date est définie, la date doit apparaître dans le champ editText.Bien que cela soit assez simple, je ne trouve pas pourquoi j'obtiens une exception nullPointer.J'ai essayé plusieurs méthodes et beaucoup modifié mon code, mais rien ne fonctionne.Ici c'est un des concepts de mon code :

Commencer les cours:

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");

}

}

Classe DatePick :

 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);
}
}

aussi 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>

Je l'avais fait fonctionner avec une autre méthode, mais elle est obsolète et je ne veux pas l'utiliser.DialogFragments semble être la bonne façon de procéder.

MODIFIER:

 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)
Était-ce utile?

La solution

C'est parce que tu utilises editText = (EditText) view.findViewById(R.id.etDepDate);.findViewById renvoie null dans ce cas car editText n'est pas un enfant de la vue DatePicker.

Si le editText fait partie de la vue du contenu de votre activité, vous pouvez utiliser ceci :

editText = (EditText) getActivity().findViewById(R.id.etDepDate);

Ce n’est d’ailleurs pas vraiment une bonne pratique.De préférence, vous transmettrez un OnDateSetListener externe au fragment.

Autres conseils

Cette ligne

    editText = (EditText) view.findViewById(R.id.etDepDate);

vous donne une erreur car vous ne trouvez pas votre EditText dans DatePicker.Vous devrez réussir votre EditText dans le constructeur pour DatePick ou d'une manière ou d'une autre, lui transmettre la valeur dans son original Activity

Créez un constructeur pour votre classe DatePicker et transmettez-lui le EditText.Par exemple:

public DatePickerFragment (EditText editText) {
    this.editText = editText;
}

puis utilisez-le simplement dans onDateSet() méthode.

utiliser

editText = (EditText) getActivity().findViewById(R.id.etDepDate);

au lieu de

editText = (EditText) view.findViewById(R.id.etDepDate);

Parce que, vous n'avez pas d'EditText dans votre boîte de dialogue DatePick .. En raison de cette seule Findviewide () renvoyant null ..

Et si vous supprimez la vue de cette fonction?

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);
}

Vous ne pouvez pas accéder EditText à l'intérieur DatePick classe.Vous devez renvoyer le texte à Start depuis DatePick classe.vous pouvez le faire de cette façon.

  1. Définir une interface et une méthode de rappel dans DatePick classe.

    callbackListener listener;
    
    interface callbackListener {
    public void setText(String text);
    }
    
  2. Implémenter l'interface dans 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);
    

    }

  3. Dans onAttach méthode de DatePick La classe attribue l’activité d’origine à l’objet d’interface.

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        listener = (callbackListener) activity;
    }
    

4.Appelez la méthode de rappel dans onDateSet méthode et passer le texte

public void onDateSet(DatePicker view, int year, int month, int day) {
    listener.setText(day + "/" + month + "/" + year);
}

Étant donné que votre EditText est en activité de fragment et non dans la boîte de dialogue DatePicker, vous ne pouvez pas y accéder directement de cette manière.Essayez de créer une référence à votre activité de fragment et d'y accéder via une méthode.Déclarez la portée de l'EditText à accéder à l'ensemble de cette activité.Ensuite,

public void setDate(String Dte){
  editText.setText(Dte);
}

et simplement reconstruire votre méthode de dialogue surDateset comme ceci.

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);
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top