Подтвердить что ты не робот

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);
    }
}
4b9b3361

Ответ 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 еще раз.