LinearLayout layout_weight = 1,layout_height = 0dp仅适用于预览?

时间:2013-12-25 19:29:59

标签: android android-layout user-interface android-linearlayout

我在侧边栏中有三个线性布局。我希望第一个填充剩余的空间,另外两个将指定它们的高度。我遇到的问题是第一个视图根本没有拉伸以填充高度。请参阅下面的代码。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="wrap_content"
              android:layout_height="match_parent"
              android:background="#FF44807f"
              android:id="@+id/musicSideBar">
    <!-- I want this layout to fill whatever vertical space remains -->
    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="0dp"
        android:background="#FF003938"
        android:layout_weight="1">
    </LinearLayout>

    <!-- this has a list of ImageView, so I set it to wrap_content -->
    <LinearLayout
        android:layout_below="@id/sidebarHeader"
        android:id="@+id/mediaControls"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="8dp"
        android:paddingTop="8dp"
        android:paddingRight="8dp"
        android:paddingBottom="8dp"
        android:background="#FF095150"
        >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/play_pause_btn"
            android:src="@drawable/play_icon"
            style="@style/media_button"
            />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/stop_btn"
            android:src="@drawable/stop_icon"
            style="@style/media_button"
            />



        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/prev_btn"
            android:src="@drawable/prev_icon"
            style="@style/media_button"
            />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/next_btn"
            android:src="@drawable/next_icon"
            style="@style/media_button"
            />

        </LinearLayout>

    <!-- A custom view that I specify it's height in onMeasure using setMeasuredDimensions -->
    <jaywhy13.gycweb.components.NowPlayingView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FF44807f"
        android:paddingTop="10dp"
       />


</LinearLayout>

我觉得它应该在Android Studio Preview Android Studio Preview

中运行

但是当我通过模拟器运行它时,它不起作用。 Simulator

您可以看到,对于模拟器,线性布局根本不会拉伸。

2 个答案:

答案 0 :(得分:1)

layout_weight不会像这样工作才能正常工作你需要将布局权重设置为LinearLayout内的所有布局,这些布局将修复你不想要的所有3个布局的高度。

您应该将第一个布局的高度设置为match_parent,将下一个布局设置为wrap_content,并将父布局的重力设置为底部。

这将首先使用height wrap_content放置最底部布局,然后将第二个布局放置为高度wrap_content,并使用任何高度保留最顶层布局

示例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="wrap_content"
              android:layout_height="match_parent"
              android:background="#FF44807f"
              android:gravity="bottom"  <!--here-->
              android:id="@+id/musicSideBar">
    <!-- I want this layout to fill whatever vertical space remains -->
    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        android:background="#FF003938"
        >
    </LinearLayout>

    <!-- this has a list of ImageView, so I set it to wrap_content -->
    <LinearLayout
        android:layout_below="@id/sidebarHeader"
        android:id="@+id/mediaControls"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="8dp"
        android:paddingTop="8dp"
        android:paddingRight="8dp"
        android:paddingBottom="8dp"
        android:background="#FF095150"
        >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/play_pause_btn"
            android:src="@drawable/play_icon"
            style="@style/media_button"
            />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/stop_btn"
            android:src="@drawable/stop_icon"
            style="@style/media_button"
            />



        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/prev_btn"
            android:src="@drawable/prev_icon"
            style="@style/media_button"
            />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/next_btn"
            android:src="@drawable/next_icon"
            style="@style/media_button"
            />

        </LinearLayout>

    <!-- A custom view that I specify it's height in onMeasure using setMeasuredDimensions -->
    <jaywhy13.gycweb.components.NowPlayingView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FF44807f"
        android:paddingTop="10dp"
       />


</LinearLayout>

答案 1 :(得分:1)

尝试用RelativeLayout替换外部LinearLayout。在内部视图中为android:layout_height="0dp"android:layout_weight="1"工作。