2012-07-03 39 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 –

相关问题