2016-11-18 67 views
-1

我想創建一個DatePicker對話框,當我按照自定義佈局創建的對話框中的按鈕時打開。我已經嘗試了許多不同的代碼配置,並且按下按鈕時的結果始終是NullPointerException或按鈕不執行任何操作。我對android編程非常陌生,但我最好的猜測是findViewById無法找到按鈕,因爲我正在使用Fragment並且未指定內容視圖。我試圖使用setContentView,但那不起作用。希望有人可以弄清楚,讓我知道他們是怎麼做到的!NullPointerException當在片段中設置onClickListener

NewTaskDialogFragment.java:

public class NewTaskDialogFragment extends DialogFragment implements 
     android.view.View.OnClickListener { 
    public int mYear, mMonth, mDay; 
    public static final int DIALOG_ID = 0; 
    private Button btn; 
    private View dialogView; 


    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Context context = getActivity(); 


     AlertDialog.Builder builder = new AlertDialog.Builder(context); 


     LayoutInflater inflater = LayoutInflater.from(context); 
     dialogView= inflater.inflate(R.layout.new_task_dialog, null); 
     builder.setView(dialogView) 

     ; 
     btn =(Button) dialogView.findViewById(R.id.datePickerDialogButton); 
     showDialogOnButtonClick(); 

     return builder.create(); 
    } 
    public void showDialogOnButtonClick(){ 



     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       getActivity().showDialog(DIALOG_ID); 
      } 
     }); 
    } 

    private DatePickerDialog.OnDateSetListener dpickerListener 
      = new DatePickerDialog.OnDateSetListener() { 
     @Override 
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
      TextView dateDisplay = (TextView) getActivity().findViewById(R.id.dateDisplayBox); 

      mYear = year; 
      mMonth = monthOfYear; 
      mDay = dayOfMonth; 
      dateDisplay.setText(mYear + mMonth + mDay); 
     } 
    }; 

    @Override 
    protected Dialog onCreateDialog(int id){ 
     if(id == DIALOG_ID) { 
      return new DatePickerDialog(getActivity(), dpickerListener , mYear, mMonth, mDay); 
     }else{ 
      return null; 
     } 
    } 


    @Override 
    public void onClick(View view) { 

    } 
} 
+0

你的'getActivity()'返回** null **嗎? –

回答

0
import android.support.v4.app.Fragment; 

public class FooFragment extends Fragment { 
    // The onCreateView method is called when Fragment should create its View object hierarchy, 
    // either dynamically or via XML layout inflation. 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
     // Defines the xml file for the fragment 
     return inflater.inflate(R.layout.fragment_foo, parent, false); 
    } 

    // This event is triggered soon after onCreateView(). 
    // Any view setup should occur here. E.g., view lookups and attaching view listeners. 
    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     // Setup any handles to view objects here 
     // EditText etFoo = (EditText) view.findViewById(R.id.etFoo); 
    } 
} 
-1

,您已經註冊的方法showDialogOnButtonClick點擊監聽器,在你的onClick有getActivity方法這個動作可能會導致NullPointException,可以打印日誌!在getActivity之前,確保你的片段附加到活動並且它是積極的!

1

嘗試在public Dialog onCreateDialog(Bundle savedInstanceState) {}的按鈕初始化下方添加btn.setOnClickListener(new View.OnClickListener() {},而不是從功能showDialogOnButtonClick()調用它。從函數調用它可能會返回getActivity()爲空。 希望這會幫助你。