我正在學習使用Fragment
和DialogFragment
。作爲訓練,我試圖擴展the DialogFragment page中給出的AlertDialog
示例。顯然,一切都很好:當我顯示選項菜單並單擊它的按鈕時,出現一個對話框,它的行爲如預期。但是,如果在顯示對話框時配置發生變化(例如當我旋轉屏幕時),則會正確重新創建對話框,但單擊其任何按鈕會使應用程序崩潰。我已經嘗試了很多東西(例如,靜態newInstance
,setRetainInstance
,onSaveInstanceState
方法和其他記錄的建議)來解決問題,但似乎沒有任何工作,所以我在起點。我正在使用支持庫v4。運行時配置更改後DialogFragment變爲空
這是我的主要活動代碼:
public class MainActivity extends FragmentActivity {
private MyDialogFragment dlgf;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
showMyDialog();
return true;
}
private void showMyDialog(){
dlgf = MyDialogFragment.newInstance();
dlgf.show(getSupportFragmentManager(), "dialog");
}
public void doPositive() {
// do stuff...
dlgf.getDialog().dismiss();
}
public void doNegative() {
// Cancel button pressed
dlgf.getDialog().dismiss();
}
}
,這是我DialogFragment
代碼:
public class MyDialogFragment extends DialogFragment {
private View view;
public static MyDialogFragment newInstance() {
MyDialogFragment dlgf = new MyDialogFragment();
return dlgf;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
view = getActivity().getLayoutInflater().inflate(R.layout.alertdialog, null);
return new AlertDialog.Builder(getActivity())
.setView(view)
.setTitle("A Title")
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int buttonID) {
((MainActivity)getActivity()).doPositive();
}
})
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int buttonID) {
((MainActivity)getActivity()).doNegative();
}
})
.create();
}
}
當點擊取消按鈕的logcat後執行崩潰顯示了doNegative方法NullPointerException
。如果點擊OK按鈕後發生崩潰,則NullPointerException
發生在doPositive方法中。看起來很明顯,DialogFragment
對象爲空。
請問有人可以幫助我嗎? TIA