0

私は、携帯電話とタブレットでレイアウトが異なるAndroidアプリに取り組んでいます。携帯電話では、私のゲーム アクティビティ レイアウトは、4 つのタブを持つタブ付き UI として機能します。これらを A、B、C、D と呼びます。ボタンのタブバーと、4 つのフラグメントを持つ ViewFlipper があります。したがって、C タブをタップすると、ViewFlipper はその子である FragmentC を表示します。FragmentC には ListView が含まれています。ユーザーがアイテムをタップすると、そのアイテムの詳細ビューを表示したいと考えています。そのため、FragmentC は FragmentTransaction を使用して新しい DetailFragment を追加します。この新しい DetailFragment は FragmentC を完全にカバーします。あなたがiOSに精通しているなら、私は基本的にUINavigationControllerタイプの動作を得ようとしています。これは、電話で問題なく動作します。

タブレットでは、私のゲーム アクティビティ レイアウトは画面を FragmentA、FragmentB、FragmentC、FragmentD の 4 つの等しい象限に分割するだけです。それは問題なく動作しているように見えます。それらはすべて問題なく表示されます。ただし、タブレット UI では、FragmentC の ListView のアイテムの 1 つをタップすると、コードが実行されて新しいフラグメントが追加されますが、画面には何も表示されません。

私の電話のgameactivity.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/viewRoot" ...>
    <LinearLayout android:id="@+id/tabBarRoot" ...>
        <Button ... />
        <Button ... />
        <Button ... />
        <Button ... />
    </LinearLayout>

    <ViewFlipper android:id="@+id/viewFlipperMainMenu" ...>
        <fragment class="FragmentA" ... />
        <fragment class="FragmentB" ... />
        <fragment class="FragmentC" ... />
        <fragment class="FragmentD" ... />
    </ViewFlipper>
</RelativeLayout>

私のタブレットのgameactivity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/viewRoot" ... >
    <LinearLayout ... >
        <fragment class="FragmentB" ... />
        <fragment class="FragmentA" ... />
    </LinearLayout>

    <LinearLayout ... >
        <fragment class="FragmentC" ... />
        <fragment class="FragmentD" ... />
    </LinearLayout>

</LinearLayout>

電話とタブレットの両方の FragmentC のレイアウト xml:

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

    <ListView android:id="@+id/listView" ... />

</LinearLayout>

FragmentC の List 項目がタップされると、FragmentC は次のコードで新しい DetailFragment を追加します。

public void pushNewFragment(Fragment fragment, String description) {
    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    transaction.add(R.id.viewRoot, fragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .addToBackStack(description).commit();
}

電話では、これは問題なく機能し、DetailFragment が表示されます。タブレットでは、pushNewFragment() メソッドが呼び出されても目に見えることはありません。

何か案は?

4

1 に答える 1

1

階層に ofをLinearLayouts持つものが 2 つある可能性があります (gameactivity.xml に 1 つ、フラグメント C の xml に 1 つ)。id@+id/viewRoot

何らかの理由でフラグメントを階層内の間違ったポイントにアタッチしようとしている可能性があると考えていますが、これが 1 つの画面レイアウトでのみ問題になる理由はわかりませんでした。

編集:

タブレットの gameactivity.xml に、子ビューを追加する余地がなくなった可能性があります。つまり、LinearLayout2 つの子を含むトップ レベルがありLinearLayoutます。私は、それらの子が親を満たすようにLinearLayout構成されているとlayout_height推測しています。layout_width次に別のビューを親に追加するLinearLayoutと、レンダリングするスペースがなくなる可能性があります。

LinearLayout親を aでラップし、新しいフラグメントが既存のフラグメントをオーバーレイできるようFrameLayoutに s の id を指定するとどうなるでしょうか?@+id/viewRoot

于 2012-02-27T21:34:39.477 に答える