23

android-support-v4 フラグメント API を使用する「hello world」風のサンプル アプリがあります。アクティビティはボタンで構成され、クリックすると DialogFragment が表示されます。ただし、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);
    }
}
4

4 に答える 4

32

これについてコメントするだけです:

「setRetainInstance(true) が使用されている場合でも。」

「たとえ」ではなく、「だから」です。setRetainInstance が false の場合、ダイアログは問題なく回転します。

これは私がここで見つけた回避 策です。

@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();
}
于 2012-11-28T01:47:56.503 に答える
5

DialogFragments は独自に回転の変更に耐えます。setRetainInstance は必要ありません。

ただし、設定した場合、これは setRetainInstance(true) と DialogFragments で再現可能なバグです

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

RetainInstanceを設定しないでください。ダイアログは問題なく動作します

ただし、DialogFragment で AsyncTask を実行していて、それを保持したい場合は、AsyncTaskLoader で LoaderManager を使用します。構成の変更にも耐えます。

于 2012-12-07T19:04:30.603 に答える
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 を上書きしなくても、回転時にダイアログの再作成自体を処理する必要があります。

于 2013-09-23T08:18:37.610 に答える
-13

try to add

android:configChanges="orientation"

in AndroidManifest file againt your activity.

于 2012-07-03T09:09:02.023 に答える