2

我正在學習使用FragmentDialogFragment。作爲訓練,我試圖擴展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

回答

2

Activity最初設置爲dlgf的實例showMyDialog()在配置更改時被銷燬並創建一個新實例。那個新的沒有dlgf設置,所以你得到NPE。

getActivity()Fragment的內部將返回Fragment附加到的當前活動實例。在你的情況下,它會正確調用新實例中的方法。

要解決您的問題,您可以簡單地將導致回調的Fragment傳遞給您的Activity,因此您不必存儲對其的引用。

// in activity 
public void doPositive(MyDialogFragment source) { 
    // do stuff... 
    source.getDialog().dismiss(); 
} 

// in dialog fragment 
.setPositiveButton("OK", 
    new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int buttonID) { 
      ((MainActivity)getActivity()).doPositive(MyDialogFragment.this); 
     } 
    }) 

另一種可能是讓你Activity保留使用onRetainNonConfigurationInstance()/getLastNonConfigurationInstance()參考其MyDialogFragment

相關問題