2016-04-05 16 views
1

我有一個帶有TextView的片段。在單擊TextView時,我想調用另一個片段中的DatePicker,並且所選日期應顯示在前一個片段的TextView中。ANDROID:使用片段中的DatePicker

但是,我收到以下錯誤。

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                          at com.example.vkrishnakumar.finallogin.FlightFragment.onCreate(FlightFragment.java:34) 

我按照下面的鏈接參考。 Implementing DatePicker in Fragment

這是我的包含TextView的Fragment的代碼。

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

} 
} 

這是FlightFragment中使用的SelectDateFragment。

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'爲空。發佈代碼爲Fragment設置ID爲 –

+0

問題的TextView t =(TextView)getView()。findViewById(R.id.book_f_dep);' –

回答

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

你應該調用findView後onCreateView(),你應該有一個更好了解片段的生命週期 – coderzhu

+0

僅提供代碼解答,請添加解釋如何解決問題......而不是在評論中編輯您的答案 –

+0

解決了問題。謝謝。 –

1

在片段生命週期onCreateonCreateView之前被調用,所以你得到空指針異常,因爲在自己的意見沒有被填充呢。覆蓋onViewCreated函數並在那裏添加代碼。

1

在你FlightFragment片段做這個

@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; 

} 

在自己的代碼中的onCreate被onCreateView之前運行,使代碼拋出NullPointerException異常

0

不要

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