DialogFragment исчезает при вращении, несмотря на setRetainInstance (true)
У меня есть приложение-hello world -ish sample, которое использует API-интерфейсы android-support-v4.
Активность состоит из кнопки, щелкнув по ней, появится диалоговое окно "Диалог".
Однако изменения конфигурации, такие как вращение, приводят к исчезновению диалогового окна, даже если используется setRetainInstance (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);
}
}
Ответы
Ответ 1
Просто прокомментируйте это:
", даже если используется setRetainInstance (true).
Это не "даже если", это "из-за этого". Если setRetainInstance является ложным, диалоговое окно поворачивается просто отлично.
Это работа, которую я нашел здесь, которая отлично подходит для меня: 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();
}
Ответ 2
Диалоговые фрагменты выживают независимо друг от друга, поэтому не нужно устанавливатьRetainInstance
Однако, если и установить его, это воспроизводимая ошибка с setRetainInstance (true) и DialogFragments
http://code.google.com/p/android/issues/detail?id=17423&q=setRetaininstance&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars
просто не устанавливайтеRetainInstance, ваш диалог будет работать просто отлично
Однако, если у вас есть AsyncTask, работающий в вашем DialogFragment, и вы хотите сохранить его, используйте LoaderManager с AsyncTaskLoader.. он также сохраняет изменения конфигурации
Ответ 3
Для тех, у кого есть проблемы даже после 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
...
}
ДиалогFragment должен обрабатывать саму настройку диалога при вращении даже без setRetainInstance или перезаписывать onDestroyView.
Ответ 4
попытайтесь добавить
android:configChanges="orientation"
в файле AndroidManifest еще раз.