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)
È stato utile?

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.

  1. Definire un'interfaccia e un metodo di callback in DatePick classe.

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

    }

  3. In onAttach metodo di DatePick 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);
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top