1. ホーム
  2. android

[解決済み] JetpackのAndroid Navigationコンポーネントでフラグメントを破壊/再現する

2022-10-20 14:35:02

質問

私は ナビゲーションをJetpackのアーキテクチャコンポーネント を既存のアプリに実装しようとしています。

私は単一のアクティビティアプリを持っており、メインフラグメント ( ListFragment ) はアイテムのリストです。現在、ユーザーがリスト アイテムをタップすると、2 番目のフラグメントが、スタックに fragmentTransaction.add(R.id.main, detailFragment) . そのため、戻るが押されると DetailFragment が切り離され ListFragment が再び表示される。

Navigationアーキテクチャでは、これは自動的に処理されます。新しいフラグメントを追加する代わりに、それは に置き換えられます。 に置き換えられるので、フラグメントビューは破棄されます。 onDestroyView() が呼び出され onCreateView() はビューを再作成するためにバックが押されたときに呼び出されます。

で使われる良いパターンだと理解しています。 ライブデータ ビューモデル を使用して必要以上のメモリを使用しないようにしていますが、私の場合、リストのレイアウトが複雑で、それを膨らませるのに時間とCPUがかかるため、これは厄介です。また、リストのスクロール位置を保存して、ユーザーがフラグメントを去ったのと同じ位置に再びスクロールする必要があります。それは可能ですが、それはより良い方法が存在する必要があるように思われます。

私は、フラグメントのプライベートフィールドにビューを保存し、それを onCreateView() はすでにありますが、アンチパターンのようです。

private View view = null;

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

    if (view == null) {
        view = inflater.inflate(R.layout.fragment_list, container, false);
        //...
    }

    return view;
}

レイアウトの再膨張を避けるために、他にもっとエレガントな方法はないでしょうか?

どのように解決するのですか?

イアン・レイク Googleから私たちができることを私に答えた ビューを変数に格納する そして の代わりに を使うことで、新しいレイアウトを膨らませることができます。 を返すだけです。 のインスタンスを返します。 保存されたビュー onCreateView()

出典 https://twitter.com/ianhlake/status/1103522856535638016

リークカナリア はこれをリークと表示するかもしれませんが、その 偽陽性 ..