13

Fragment典型的なリスト詳細デザインパターンでsを適切に管理する方法に頭を悩ませています。

私のレイアウトは正常に機能しており、横向きのビュー(デュアルペイン)では次のように構成されています。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ... >
    <FrameLayout android:id="@+id/list" ... />
    <FrameLayout android:id="@+id/container" ... />
</LinearLayout>

そして、ポートレートビュー(単一ペイン)の場合は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/container" ... />

また、デバイスの画面幅に基づいて適切なレイアウトが読み込まれるようにするための情報refs.xmlもあります。res/values-w600dp/

リストアイテムを選択すると、横向きのビューにはリストと詳細が並べて表示され、縦向きのビューには詳細のみが全画面表示されます。何も選択されていない場合、横向きのビューでは左側に左側、右側に空白のスペースが表示され、縦向きのビューではリストのみが全画面表示されます。

例

しかし、ここで私は問題を抱えています:

  • リスト+オプションの詳細レイアウトに「メイン」を使用し、縦向きの詳細のみのレイアウトにActivity別の「詳細」を使用しますか?Activityこれは、フラグメントガイドの例が行うことのようです。このアプローチは一般的に機能するようになりましたが、向きが変わったときに詳細フラグメントの状態を維持するにはどうすればよいですか?

    上記の反対のケースを考えてみましょう。詳細が表示されているときに縦向きから横向きに回転すると、メインが2ペインのレイアウトを表示できるように詳細を編集Activityする必要がありますが、これにより詳細フラグメントとそのも破壊されます。ユーザーが詳細フラグメントのフィールドに情報を入力してからデバイスを回転させた場合、メイン(2ペイン)に追加するときに詳細フラグメントのUI状態全体を保持するにはどうすればよいですか?finish()ActivitysavedInstanceStateEditTextActivity

  • 1つだけ使用しActivityて、自分で管理しFragmentますか?これにより、向きが変わったときに詳細UIの状態を保持できます(Androidがこれを自動的に処理するため)が、バックスタックになると面倒になります。

    画像の場合を考えてみましょう。詳細が表示されているときに横から縦に回転すると、詳細が単一ペインで表示されますが、バックスタックとActionBarホームアイコンを適切に管理してリストを単一ペインで表示するにはどうすればよいですか?横向きに戻すと、両方のフラグメントが同時に表示されるため、以前に行ったバックスタック操作を元に戻す必要があります。

さらに検索したところ、2つの同様の質問が見つかりました(フラグメントスタックを維持する方向変更でデュアルペインからシングルペインに切り替え、アクティビティ間でフラグメント状態を保持する)が、この機能を改良しようとはしていないので、状況は少し異なりますが、事前に計画してください。私は何が欠けていますか?確かに、Androidはバックスタック(複数のActivity場合のように)UIの状態(単一のActivity場合のように)の両方を一度に管理できますよね?

4

2 に答える 2

6

私は複数の活動ルートに行くことによってこれを解決しました。 「アクティビティ間でフラグメント状態を保持する」に対する私の回答を参照してください

キーはFragmentManager.saveFragmentInstanceState()、フラグメントのUIの状態を保存しFragment.setInitialSavedState()、別のアクティビティで同じフラグメントをインスタンス化するときにそれを復元するために使用していました。

私の目的では、2つのケースでUIの状態を保存する必要があることがわかりました。フラグメント内にヘルパーメソッドを作成し、フラグメントの新しいインスタンスをデュアルペインレイアウトにアタッチするために使用する直前public void saveState()のフラグメント自体のメソッドと「メイン」アクティビティからこれを呼び出します。onPause()replace()

このタイプのシングル/デュアルペインレイアウトシナリオに必要なバックスタック操作が可能かどうか、またはシングルアクティビティアプローチonBackPressedでバックスタックを手動でオーバーライドしてシミュレートする必要があるかどうかについては、まだ興味があります。

于 2012-09-17T19:21:44.660 に答える
4

使用できるアクティビティは1つだけですが、縦向きの場合はバックスタックを自分で管理する必要があります。

アプリの動作を説明すると、次の4つの状態が発生する可能性があります。

  • 状態A:縦向き、リストの断片を示しています。
  • 状態B:ポートレート、バックスタックのリストフラグメントとともに詳細フラグメントを表示します。
  • 状態C:横向き。左側にリストの断片が表示され、右側に空白が表示されます。
  • 状態D:横向き。リストフラグメントと詳細フラグメントの両方を並べて表示します。

あなたが状態Dにいて(両方のフラグメントがあるので、それらをFAとFBと呼びましょう)、電話の向きを変更するとします。次の状態は状態Bである必要がありますが、問題は、ポートレートレイアウトにが1つしかないことFrameLayoutです。単一ペインのレイアウトとして以下を使用します。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/list" ... />

AndroidはFAを再作成し、それに接続しFrameLayoutます。一方、FBも再作成されますが、コンテナが関連付けられていないため、表示されません。この時点で、FBと同じ内容の別のフラグメントFB2を作成し、それを使用してFAを置き換えることができます。バックスタックにFA-FB2があり、FBが非表示になっています。

向きをもう一度変更すると(状態Dを期待して)、を使用onSaveInstanceState()してバックスタックからFB2をポップしpopBackStack()、FAとFBを再び使用できます。FB2を削除する前に、そのコンテンツをFBにコピーすることもできます。アプリが再び状態Dになると、FBはFrameLayoutを持ちます。

あなたが世話をしなければならない他のいくつかの移行と状況があるでしょう、しかし主な考えはそれでしょう。

これはあまり洗練された解決策ではないので、この問題を解決するには、より良い、おそらくより効率的な(たとえばフラグメントを複製しない)方法でなければならないと確信しています。

于 2013-05-24T18:45:57.230 に答える