2012-07-03 41 views
21

我有一個「hello world」-ish示例應用程序,它使用了android-support-v4 fragments API。 該活動由一個按鈕組成,點擊它將顯示一個DialogFragment。 但是,即使使用setRetainInstance(true),配置更改(如旋轉)也會導致對話框消失。儘管有setRetainInstance,但DialogFragment在旋轉時消失了(true)

任何想法如何解決這個問題?

RetFragment.java

package me.local.HelloFroyo; 

import android.os.Bundle; 
import android.support.v4.app.*; 
import android.util.Log; 
import android.view.*; 

public class RetFragment extends DialogFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.hello_dialog_fragment, container); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.e("RET", "onDestroy"); 
    } 
} 

MainActivity.java

package me.local.HelloFroyo; 

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.View; 

public class MainActivity extends FragmentActivity { 

    private static final String TAG_DLG = "myFragDlg"; 

    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     this.setContentView(R.layout.activity_main); 
    } 

    public void onShowClick(View v) { 
     RetFragment ret = new RetFragment(); 
     ret.show(getSupportFragmentManager(), TAG_DLG); 
    } 
} 

回答

28

只是爲了對此有何評論:

「即使使用setRetainInstance(真)」。

這不是「即使」,而是「因爲它」。如果setRetainInstance爲false,則對話框旋轉得很好。

這是解決辦法,我發現在這裏,這對我來說工作得很好:http://code.google.com/p/android/issues/detail?id=17423

@Override 
public void onDestroyView() 
{ 
    Dialog dialog = getDialog(); 

    // Work around bug: http://code.google.com/p/android/issues/detail?id=17423 
    if ((dialog != null) && getRetainInstance()) 
     dialog.setDismissMessage(null); 

    super.onDestroyView(); 
} 
+7

這似乎並不適用於我 - 對話仍然被駁回.. – ch3rryc0ke

+0

@ ch3rryc0ke你有沒有找到任何解決方案,我有同樣的問題,我已經實現了上面的代碼,但對話框仍然被解僱 – drisse

+0

我不確定這裏的解決方法,但是你是對的,你不應該在這種情況下使用'setRetainInstance' 。如果有狀態你想堅持,使用'savedInstanceState'或'arguments'' Bundle'。有一個[很好的例子](http://developer.android.com/reference/android/app/DialogFragme nt.html#AlertDialog)在Android文檔中介紹如何最好地使用DialogFragment來生成AlertDialog。 – jsadler

-11

嘗試在AndroidManifest文件中添加

android:configChanges="orientation" 

againt您的活動。

+1

我不想阻止整個活動被破壞和重新創建,我只想保留DialogFragment。 – user1324237

+0

這不會再次創建您的活動。如果將其添加到您的活動中,它將保持相同的狀態。沒有這個聲明,你的活動每次都是在你改變你的方向時創建的。 –

+0

我知道,但我只想保留_dialog片段_。該活動應該被銷燬並重新創建。你是否熟悉片段API? – user1324237

4

DialogFragments生存靠自己的旋轉變化,U不需要到setRetainInstance

但是如果u設置,這是一個可再現的錯誤與setRetainInstance(真)和DialogFragments

http://code.google.com/p/android/issues/detail?id=17423&q=setRetaininstance&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

只是不setRetainInstance,如果你有一個的AsyncTask在DialogFragment一起運行,並且希望堅持使用它LoaderManager與AsyncTaskLoader你的對話會工作得很好

但是..這也是生存的配置更改

1

對於那些誰有問題,甚至setRetainInstance(true)後或覆蓋onDestroyView,仍然不能正常工作,請確保您撥打super.onSaveInstanceState()當您覆蓋onSaveInstanceState

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); // <-- must call this if you want to retain dialogFragment upon rotation 
    ... 
} 

的dialogFragment應該處理的對話框娛樂本身甚至在沒有setRetainInstance的情況下旋轉或覆蓋onDestroyView。

+0

這對我來說伎倆! +1 –

相關問題