11

タブレットと Google TV 向けのアプリケーションを開発しています。これは、LeftNavBar と、すべてのアプリケーション画面に共通のトップ検索バーを備えた、多くの標準的な Google TV アプリケーションのようなものです。次の画像のようになります。

メインスクリーン ここに画像の説明を入力

RED エリアは、他のすべての画面では異なります。次の画面のモックアップのようなデータが含まれる場合があります。

メインコンテナに積み込まれたActivity One ここに画像の説明を入力

アクティビティ 2 がメイン コンテナに積み込まれました ここに画像の説明を入力

したがって、メイン領域にまったく異なるセクションをロードできることがわかります。

画面 3 は、画面 2 で任意のリスト項目を選択したときに詳細セクションとしてロードできます (たとえば、フラグメント リストで)、またはタブを選択した結果としてロードできます (LeftNavBar に表示されます)。

これが私がそれを実装しようとしている方法です。

ステップ 1.次の XML を使用してメイン アクティビティを作成しました。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#9ccc" >

        <!-- Top Bar -->

    </LinearLayout>

    <FrameLayout
        android:id="@+id/mainContainer"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <!-- main Red Container that will load other Activities -->

    </FrameLayout>
</LinearLayout>

mainContainerアクティビティをロードしたい RED コンテナです。LeftNavBarすべての親としてこのアクティビティに追加されます。

ステップ 2ActivityOneそれぞれ 2 つと 3 つのフラグメントを含む&を作成ActivityTwoしました (上記の 2 番目と 3 番目の画像に示すように)。

*手順 3ActivityOneメイン ページのmainContainer FrameLayoutを読み込もうとしていますが、追加できません。

次のようにを追加してみましActivityOnemainContainer

View v = (new ActivityOne()).getWindow().getDecorView();
FrameLayout mainContainer = (FrameLayout) findViewById(R.id.mainContainer);
mainContainer.addView(v);

しかし、getWindow()リターンnull....

すべてのデータがリモートサービスから取得されるため、他の問題が発生しますmainContainer..また、ロードされたすべてのアクティビティへの参照をある種のスタックに保持する方法を提案してください...すでにロードされているアクティビティをリロードできます新しいインスタンスを作成する代わりに..これは、BACK ボタンを押したときに使用されます。

また

上記の RED コンテナにアクティビティをロードする代わりに、それぞれ独自のフラグメントと LeftNavBar を持つ 2 つのアクティビティを作成する必要があります。これは、前述のアプローチよりも簡単かもしれません。またはこれが唯一の解決策かもしれません....しかし、BACKボタンの状態の保存が面倒になるかもしれないと感じています..しかし、これを実装してみます

このタイプのアプリケーションを作成する必要があるとしたら、どうしますか? 最高のパフォーマンス/プラクティスのために UI レイアウトをどのように設計しますか?

このアプリのレイアウトを設定するのに役立つ提案をいただければ幸いです。

4

2 に答える 2

3

免責事項

これは、フラグメントがトリッキーになる可能性がある場所です。アクティビティ1と2のレイアウトが同じである場合、問題は単純であり、フラグメントをアタッチ/デタッチし、フラグメントのバックスタックを使用して巻き戻すことができます。

フラグメントを格納するために2つの固有のレイアウトが必要なため、状況はもう少し複雑になります。可能であれば、同じレイアウトを使用して、簡単な方法を選択できるようにします。

別のオプションとして、上記で概説した2つのアクティビティを使用して、インテントを使用してデータを送受信できます。

そうは言っても、もし私が本当にこのソリューションを書かれた通りに実装しなければならなかったら、これが私がすることです。私はこの解決策を提唱していませんが、私自身は物事を行うためのより良い方法を知りません。

ソリューション

上で定義したように、ビューがメイン画面になるFragmentActivityを作成します。メイン画面のレイアウトには次のものが含まれます。

  • 左ナビゲーションバー
  • トップバー
  • 2つのレイアウト。layout1とlayout2。これらは親レイアウト、つまりRelativeLayoutまたはLinearLayoutに含まれ、フラグメントに必要なFrameLayout要素が含まれます。

XMLの使用例(タグは少し短いことに注意してください):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#9ccc" >

        <!-- Top Bar -->

    </LinearLayout>

    <LinearLayout android:id="@+id/layout1">
        <FrameLayout android:id="@+id/listFragment" />
        <FrameLayout android:id="@+id/contentFragment" />
    </LinearLayout>

    <LinearLayout android:id="@+id/layout2">
        <FrameLayout android:id="@+id/imageFragment" />
        <FrameLayout android:id="@+id/boxFragment1" />
        <FrameLayout android:id="@+id/boxFragment2" />
        <FrameLayout android:id="@+id/boxFragment3" />
    </LinearLayout>

</LinearLayout>

主なアイデアは、layout1とlayout2を表示/非表示にすることです。つまり、アプリの状態に基づいてandroid:visibility="gone"を設定します。

この方法の欠点は次のとおりです。

  • フラグメントバックスタックを使用することは不可能な場合があります。代わりに、ユーザーがUIフローのどこにいるかを追跡し、戻るボタンを管理してレイアウトを表示/非表示にする必要があります。
  • 親ビューを表示/非表示にするときにフラグメントをアタッチ/デタッチして、フラグメントが非表示のときにリソース消費を削減するために、特別な注意が必要になる場合があります。

利点は次のとおりです。

  • 1つのアクティビティのみが使用されるため、フラグメントと基本アクティビティ間の簡単な通信
于 2012-08-01T23:33:16.383 に答える
-1

Re: ネストされたフラグメントの問題

私たちのアプリケーションの「ネストされたフラグメント」の問題を回避するために、(正しくお気づきのとおり) Fragments が s を追加できないという問題を回避するために、アクティビティの下にFragment単一のテンプレートフラグメントをホストしました。この時点以降のアクティビティにフラグメントをさらに追加するときは、テンプレート フラグメントのビュー プレース ホルダーを使用して、+@id追加されるフラグメントの「ルート」または親ビュー ID を識別しました。

    getSupportFragmentManager().beginTransaction().add(#someIdFromTheTemplateFrag, fragment, fragmentTag).commit();

私が追加していたフラグメントは、現在のレイアウトで自分自身を固定する場所を認識し、もちろん、ビューを追加する陽気な方法を取りました。これには、フラグメントを別のフラグメントにアタッチする効果があったため、目的の視覚的な「ネスト」を実現しました...

于 2012-07-25T13:56:36.293 に答える