2014-09-20 179 views
0

當屏幕方向更改時,我收到了有關dialogfragment的令人沮喪的問題。當我在處理程序中使用它時,成員對象(一個TextView)變爲null,但在屏幕旋轉後它被充氣並分配在onCreateView中。屏幕旋轉後DialogFragment成員變爲空

基本上我在對話框中有一個按鈕讓用戶從另一個活動中選擇文件。 之後,所選文件路徑將打印在textview上。

所以我必須:

mHandler = new Handler(); 

public View onCreateView(...) { 
    View rootView = .... 
    mPathView = (TextView)rootView.findViewById(...); 
    Log.d("test", String.format("%s", mPathView.toString()); 
    ... 
} 

而且我有一個方法,這就是所謂的onActivityResult附加的活動:

public void onFileSelected(...) { 
    if(reqeustCode==Activity.RESULT_OK) { 
     ... 
     mHandler.post(new Runnable() { 
      public void run() { 
       Log.d("test", String.format("mPathView==null:%b", mPathView==null)); 
       if(mPathView!=null) { 
        mPathView.setText(path); 
       } 
      } 
     } 
     return; 
    } 
    //Error handling here 
} 

如果我檢查logcat的,我可以看到:

09-20 16:13:51.264:  test [email protected] 
09-20 16:13:52.412:  test [email protected] (after rotation) 
09-20 16:13:56.129:  test mPathView==null: true (after file selected) 

我已經嘗試過onCreate中的retainInstance,但它並沒有解決這個問題。 cing新問題:在onCreateView中,savedInstanceState總是爲空。

我也知道實例是在屏幕旋轉後重新創建的。但我不明白的是,重新創建後,mPathView被分配(作爲logcat日誌指示)。

我懷疑它與活動重新創建有某種關係,因爲我有一個在Activity的onCreate中創建的對話框實例...所以在onActivityResult中,對話框的引用不再是顯示的對象。但在這個時候,我還沒有證實它,並沒有保持對話的實例的好主意。

我已經閱讀了一些在StackOverflow的帖子,但仍然無法得到它的工作...任何幫助,非常感謝!

回答

0

現在我已經驗證了我所懷疑的並且是原因。

,所以我必須寫一些不-好看的代碼,使其工作: 在活動中我添加了一個方法

public void setDialogInstance(FileSelectDialog dialog) { 
    mDialog = dialog; 
} 

而在FileSelectDialog,我重寫onActivityCreated方法

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(..); 
    try { 
     MainActivity host = (MainActivity)getActivity(); 
     host.setDialogInstance(this); 
    } catch(ClassCastException e) {} 
} 

起初我試圖在onAttach方法中調用setDialogInstance方法,但只是在活動的onCreate之前找到它。

我想也許可以引入一個接口,以便DialogFragment不需要知道主機的具體活動。