android:layout_marginBottom 不离开 space 在底部

android:layout_marginBottom not leaving space at bottom

我的项目中有一个 TabHost activity。当我有以下 XML 时,选项卡不在屏幕上,根本不显示。

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/tabHost"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activityVerticalMargin"
    android:paddingLeft="@dimen/activityHorizontalMargin"
    android:paddingRight="@dimen/activityHorizontalMargin"
    android:paddingTop="@dimen/activityVerticalMargin"
    tools:context=".SomeActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="50dp">

            <some elements here>

        </FrameLayout>

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="50dp" />

    </LinearLayout>

</TabHost>

但是,如果我稍微修改成这样,标签会显示,但它们不在底部,这不是我想要的样子。

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/tabHost"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activityVerticalMargin"
    android:paddingLeft="@dimen/activityHorizontalMargin"
    android:paddingRight="@dimen/activityHorizontalMargin"
    android:paddingTop="@dimen/activityVerticalMargin"
    tools:context=".SomeActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="50dp">

            <!-- layout_height above was changed to wrap_content -->

            <some elements here>

        </FrameLayout>

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="50dp" />

    </LinearLayout>

</TabHost>

为什么在第一种情况下它不起作用? layout_marginBottom 不是应该使布局的高度 match_parent - margin(在本例中为 50dp)吗?

好吧,有一种方法可以通过 LinearLayout 来做到这一点(无论如何我们应该避免 RelativeLayout)。我们可以为您的 TabWidget 元素提供负边距。您的布局如下所示:

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
         android:id="@+id/tabHost"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:paddingBottom="@dimen/activityVerticalMargin"
         android:paddingLeft="@dimen/activityHorizontalMargin"
         android:paddingRight="@dimen/activityHorizontalMargin"
         android:paddingTop="@dimen/activityVerticalMargin"
         tools:context=".SomeActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="50dp">

            <!-- some elements here -->

        </FrameLayout>

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="-50dp"/>

    </LinearLayout>

</TabHost>

将父 LinearLayout 转换为 Relativelayout。框架布局应该有参数 align_parenttop = true,tabwidget 应该有 align_parentBottom = true。让剩下的留下来。