2

かなり単純なDialogFragmentがあります。次のようになります。

import android.support.v4.app.DialogFragment;

public class MyDialogFragment extends DialogFragment {

    private String mData = "empty";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(LOG_TAG, "onCreate");

        setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        // setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.mydialog, container);

        ....

        return view;
    }

    public setData(String _data) {
        mData = _data;
    }
}

私はこのフラグメントを私のようにロードしますFragmentActivity

FragmentManager lFM = getSupportFragmentManager();
MyDialogFragment lDialog = new MyDialogFragment();
lDialog.setData("not empty");
lDialog.show(lFM, "MyDialog");

上記のコードは正常に機能します。ただし、mDataフィールドが保持されるように、方向スイッチでフラグメントを保持したいと思います。追加するsetRetainInstance(true);と(そしてデバッグを続けた後)、フラグメントが実際に方向スイッチに保持されていることがわかります-onCreate()今回は呼び出されていません。呼び出されていることがわかりonCreateView()、正しいViewオブジェクトを返しますが、ダイアログが画面に表示されません。私は何が欠けていますか?

4

3 に答える 3

1

babooが私に与えた答えを読んだ後、私は次のように解決策を実装しました..これが正しいことを願っています(少なくともそれはうまくいきます...)

@Override
public void onCreate(Bundle savedInstanceState) {

  // ....

  FragmentManager lFM = getSupportFragmentManager();
  if(lFM.findFragmentByTag("MyDialog")!=null)
    ((MyDialogFragment)lFM.findFragmentByTag("MyDialog")).show(lFM, "MyDialog");

  // ....
}
于 2013-02-04T16:33:31.630 に答える
0

フラグメントアクティビティで次のロジックを試してください。

putメソッドを使用して、onSaveInstanceState()に値を格納します。

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putBoolean("dialogDisplayed", value);    // set value = true when displayin dialog...
}

そして、onCreate()で値を復元します。

 public void onCreate(Bundle icicle) {
   if (icicle != null){
     value = icicle.getBoolean("dialogDisplayed");
   }
   if(value)
       //Display Dialog here.... 

 }
于 2013-01-31T08:01:47.777 に答える
-1

次の操作を行う限り、ダイアログフラグメントは自動的に保存されます。

  1. アクティビティonSaveInstanceState()を呼び出す場合は、必ずスーパー関数を呼び出してください!!!! 。私の場合、それが鍵でした。また、フラグメントでも同じことを行うようにしてください。
  2. を使用する場合はsetRetainInstance、値を手動で保存して再適用する必要があります。そうでなければ、ほとんどの場合、それについて心配することはできないはずです。もう少し複雑なことをしている場合は、そうする必要があるかもしれませんがsetRetainInstance(true)、それ以外の場合は無視してください。私の場合、クラスの1つにランダムシードを格納するためにそれを使用する必要がありましたが、それ以外は問題ありませんでした。
  3. 一部の人々は、サポートライブラリのバグについて不満を言っています。このバグでは、却下メッセージが送信されるべきではないときに送信されます。最新のサポートライブラリで修正されているようですので、心配する必要はありません。

フラグメントを手動で保存するような特別なことをする必要はありません。これらの手順に従うと、自動的に実行されるはずです。

于 2013-12-31T11:24:39.397 に答える