8

ビューの状態をフラグメントに保存しようとしていますが、アクティビティがリークしているのではないかと心配しています。これが私がしていることです:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state){
   if(mView != null){
      View oldParent = mView.getParent();
      if(oldParent != container){
         ((ViewGroup)oldParent).removeView(mView);
      }
      return mView;
   }
   else{
      mView = inflater.inflate(R.id.fragview, null)
      return mView;
   }
}

すべてのビューがコンテキストを保持していることを知っていて、それがアクティビティコンテキストなのか、インフレータからインフレートされた場合のアプリケーションコンテキストなのかわからないため、心配しています。おそらく、インフレータを使用するよりも、getActivity()。getApplication()を使用して、ビューを実用的に作成し、その属性を設定する方がよいでしょう。これについてのフィードバックをいただければ幸いです。

ありがとう!

編集:このコードはうまく機能しますが、アクティビティリークを確認しました:*(

4

3 に答える 3

2

ビューの状態をフラグメントに保存しようとしていますが、アクティビティが漏れているのではないかと心配しています。

onSaveInstanceState()(フラグメント内) および(アクティビティ内) を使用onRetainConfigurationInstance()して、構成の変更全体で「ビューの状態」を維持します。あなたが言及している他の「ビューの状態」についてはよくわかりません。

すべてのビューがコンテキストを保持していることを知っており、インフレータからインフレートされた場合にそれがアクティビティ コンテキストなのかアプリケーション コンテキストなのかがわからないため、私は心配しています。

for ビュー インフレーションを使用してApplicationもうまく機能しないように見えるため、 からインフレーションする必要がありますActivity。したがって、ビューはそれらを膨らませたアクティビティへの参照を保持します。

于 2011-03-27T19:21:36.040 に答える
1

@schwiz é は同様のものを実装しています。

setRetainInstanceフラグメントで使用します。フラグメント レイアウトには、webView を配置する FrameLayout プレースホルダーがあります。

この webView は、アプリケーション コンテキストを使用して Fragment の onCreate でプログラムによって作成されaddView(webView)ますonCreateView()

webView = new WebView(getActivity().getApplicationContext());

onDestroyView では、フレームレイアウトのプレースホルダーから webView を削除するだけです。

ビデオをフルスクリーンで再生しようとしない限り、非常にうまく機能します。アクティビティ コンテキストが必要なため、これは機能しません

于 2011-11-09T18:16:24.610 に答える
0

ビューの状態をフラグメントに保存しようとしています

ビューの状態を保存および保持するにはView.onSaveInstanceState ()View.onRestoreInstanceState (Parcelable state)

アクティビティやフラグメントから独立してビューステートの保存と復元を処理するのに役立ちます。詳細については、この回答を参照してください(画面の向きを変更してもカスタムビューの状態が失われるのを防ぐ方法

于 2012-08-15T06:55:51.783 に答える