2016-04-05 11 views
1

Ich habe ein Fragment mit einem TextView drin. Beim Klicken auf den TextView möchte ich einen DatePicker in einem anderen Fragment aufrufen und das ausgewählte Datum sollte in der TextView im vorherigen Fragment angezeigt werden.ANDROID: Verwenden von DatePicker aus Fragment

Allerdings erhalte ich den folgenden Fehler.

Ich folgte dem untenstehenden Link als Referenz. Implementing DatePicker in Fragment

Dies ist mein Code für das Fragment, das eine TextView enthält.

import android.support.v4.app.DialogFragment; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class FlightFragment extends Fragment { 

private TextView depDate; 

public FlightFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    depDate = (TextView) getView().findViewById(R.id.book_f_dep); 
    depDate.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DialogFragment newFragment = new SelectDateFragment(); 
      newFragment.show(getFragmentManager(), "DatePicker"); 
     } 
    }); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 

    return inflater.inflate(R.layout.fragment_flight, container, false); 

} 
} 

Dies ist das SelectDateFragment, das in FlightFragment verwendet wird.

import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.widget.DatePicker; 
import android.widget.TextView; 
import java.util.Calendar; 


public class SelectDateFragment extends DialogFragment implements 
DatePickerDialog.OnDateSetListener {         

public SelectDateFragment() { 
    // Required empty public constructor 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    final Calendar calendar = Calendar.getInstance(); 
    int yy = calendar.get(Calendar.YEAR); 
    int mm = calendar.get(Calendar.MONTH); 
    int dd = calendar.get(Calendar.DAY_OF_MONTH); 
    return new DatePickerDialog(getActivity(), this, yy, mm, dd); 
} 

public void onDateSet(DatePicker view, int yy, int mm, int dd) { 
    populateSetDate(yy, mm+1, dd); 
} 
public void populateSetDate(int year, int month, int day) { 
    TextView t= (TextView)getView().findViewById(R.id.book_f_dep); 
    t.setText(month + "/" + day + "/" + year); 
} 

} 
+0

'R.id.book_f_dep' null tun. den Code für das Fragment, wo Sie die ID setzen –

+0

Problem für TextView t = (TextView) getView(). findViewById (R.id.book_f_dep); ' –

Antwort

1
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View root = inflater.inflate(R.layout.fragment_flight, container, false); 
    depDate = (TextView) root.findViewById(R.id.book_f_dep); 
    depDate.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     DialogFragment newFragment = new SelectDateFragment(); 
     newFragment.show(getFragmentManager(), "DatePicker"); 
    } 
}); 
return root; 

} 
+0

sollten Sie findView nach onCreateView() aufrufen, sollten Sie eine bessere haben Verständnis des Lebenszyklus des Fragments – coderzhu

+0

Code nur Antworten werden abgeraten, fügen Sie eine Erklärung, wie dies das Problem beheben ... Und nicht in einem Kommentar, bearbeiten Sie Ihre Antwort –

+0

Das Problem gelöst.Vielen Dank. –

1

In Fragment Lebenszyklus onCreate vor onCreateView genannt und deshalb Null-Zeiger-Ausnahme, die Sie bekommen, da die Sicht noch bevölkert worden ist. Überschreiben Sie die onViewCreated Funktion und fügen Sie Ihren Code dort hinzu.

1

In Ihrem FlightFragment Fragment Sie dieses

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 

    View rootView= inflater.inflate(R.layout.fragment_flight, container, false); 

depDate = (TextView) getView().findViewById(R.id.book_f_dep); 
    depDate.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DialogFragment newFragment = new SelectDateFragment(); 
      newFragment.show(getFragmentManager(), "DatePicker"); 
     } 
    }); 

return rootView; 

} 

In Ihrem eigenen Code der onCreate vor onCreateView läuft so wird der Code Nullpointer

0

nicht Werfen Sie

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 

    return inflater.inflate(R.layout.fragment_flight, container, false); // Don't do this 

} 

 public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

       View RootView = inflater.inflate(R.layout.fragment_flight, container, false); 

      depDate = (TextView) RootView.findViewById(R.id.book_f_dep); // Problem was here 
      return RootView; 
    } 
Verwandte Themen