4

好的,我正在尝试创建一个通用应用程序,该应用程序在手机视图中显示 3 个选项卡,在平板电脑视图中显示 3 个列。因此,我使用线性布局创建了几个不同的 XML 布局。

但是,使用片段时,我遇到了一个问题 - 我想在该片段中进行选择时删除最左边的列。我相信我可以做到这一点,但事实证明我无法删除在 XML 中声明的片段。所以现在,我尝试在 XML 中创建中间列和右列:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/menu_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <fragment
        android:id="@+id/classification_fragment"
        android:name="uk.colessoft.android.hilllist.fragments.MenuClassificationFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        tools:layout="@layout/list_classifications" >
    </fragment>

    <fragment
        android:id="@+id/map"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        class="com.google.android.gms.maps.SupportMapFragment" />

</LinearLayout>

然后使用添加第一列

FragmentManager fragmentManager = getSupportFragmentManager();
        android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        MenuCountryFragment countryFragment=new MenuCountryFragment();
        fragmentTransaction.add(R.id.menu_layout, countryFragment, "country_menu").commit();

但我有两个问题:

a) 上面的代码只将片段放在线性布局的右侧,我无法指定位置。它必须在左边。

b) XML 让我可以自由地根据屏幕大小/方向为片段定义不同的权重。在 Fragments 中以编程方式设置布局参数似乎是一种倒退。我通过在 xml 中放置一个占位符视图来解决这个问题,我从中读取布局参数并将它们分配到 onCreateView 但它是一个hack。

我知道我可以通过将片段添加为 xml 中第一个元素的子元素来将片段放置在正确的位置,但是当我这样做并删除片段时,它会留下一个空白空间。

4

1 回答 1

2

为您要添加的新片段(在您的 XML 中)创建一个占位符,如下所示...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/menu_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

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


    <fragment
        android:id="@+id/classification_fragment"
        android:name="uk.colessoft.android.hilllist.fragments.MenuClassificationFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        tools:layout="@layout/list_classifications" >
    </fragment>

    <fragment
        android:id="@+id/map"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        class="com.google.android.gms.maps.SupportMapFragment" />

</LinearLayout>

然后,不是在运行时添加新片段,而是替换空容器的内容......

FragmentManager fragmentManager = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
MenuCountryFragment countryFragment=new MenuCountryFragment();
fragmentTransaction.replace(R.id.realtabcontent, newFrag).commit();
fragmentManager.executePendingTransactions();

希望这可以帮助。

于 2013-02-20T23:50:39.720 回答