嵌套线性布局与权重 - 如何在不同大小的设备上均匀分布

时间:2015-03-29 20:30:16

标签: android android-layout

我有一个垂直线性布局,有许多线性布局(水平),占据了平板电脑的左侧

如果我在嵌套布局上使用权重

,我会收到有关嵌套权重的警告

我似乎无法让事情看起来一致 - 我希望它们占据屏幕尺寸的100%

但是在一个小的5英寸屏幕上并没有显示所有项目,而在10英寸的大屏幕上,它们只占据了屏幕的30%

我想做什么?

这是小型平板电脑的样子(请注意底部物品被切断) 5" Version

以下是10英寸平板电脑的样子(注意它不再占据整面) 10" Version

<LinearLayout
            android:id="@+id/sidebar_linlay1"
            android:layout_width="0dp"
            android:layout_weight=".2"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Name" />

                <EditText
                    android:id="@+id/text_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:inputType="text" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Address" />

                <EditText
                    android:id="@+id/text_streetnum_2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:inputType="number" />

                <EditText
                    android:id="@+id/text_streetname_2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:inputType="text" >

                    <requestFocus />
                </EditText>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="City" />

                <EditText
                    android:id="@+id/text_city"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:inputType="textPostalAddress" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Zip" />

                <EditText
                    android:id="@+id/text_zip"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:inputType="number" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Email" />

                <EditText
                    android:id="@+id/edittext_email"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:imeOptions="actionDone"
                    android:inputType="textEmailAddress" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Type" />

                <Spinner
                    android:id="@+id/spin_status"
                    android:layout_width="wrap_content"
                    android:padding="0dip"
                    android:layout_height="10dp" />

            </LinearLayout>



            <EditText
                android:id="@+id/map_notes"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
               android:ems="10"
                android:inputType="textMultiLine"
                android:text="notes" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <Button
                    android:id="@+id/but_ClientForm"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Open Contract" />

                <Button
                    android:id="@+id/but_saveData"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Save Changes" />
            </LinearLayout>


        </LinearLayout>

1 个答案:

答案 0 :(得分:0)

以下是一些建议:

  • 对不同的屏幕尺寸使用备用布局。

您可以使用配置限定符执行此操作。下面是一个示例:/res/layout文件夹中的小屏幕有默认布局。现在,如果您想为更大的屏幕设置不同的布局,可以创建布局的变体并将其放在不同的文件夹中;例如/res/layout-w600dp包含最小宽度为600dp的设备的布局。

请参阅Android开发者的此页面:

Supporting Multiple Screens | Android Developers

  • 要查看较小设备上的所有视图,请将您的布局包装在ScrollView

然后,至少您的用户可以滚动查看布局中的所有视图。

  • 要在较大的设备上垂直展开视图,请在垂直视图之间使用权重Space视图。

这是我用来在大型设备上垂直传播视图的技巧。例如:

<LinearLayout
        android:id="@+id/sidebar_linlay1"
        android:layout_width="0dp"
        android:layout_weight=".2"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Name" />

            <EditText
                android:id="@+id/text_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="text" />

        </LinearLayout>

        <Space
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Address" />

            <EditText
                android:id="@+id/text_streetnum_2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="number" />

            <EditText
                android:id="@+id/text_streetname_2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="text" >

                <requestFocus />
            </EditText>

        </LinearLayout>

        <Space
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="City" />

            <EditText
                android:id="@+id/text_city"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="textPostalAddress" />
        </LinearLayout>

        <Space
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Zip" />

            <EditText
                android:id="@+id/text_zip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="number" />

        </LinearLayout>

        <Space
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Email" />

            <EditText
                android:id="@+id/edittext_email"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:imeOptions="actionDone"
                android:inputType="textEmailAddress" />

        </LinearLayout>

        <Space
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Type" />

            <Spinner
                android:id="@+id/spin_status"
                android:layout_width="wrap_content"
                android:padding="0dip"
                android:layout_height="10dp" />

        </LinearLayout>

        <Space
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />



        <EditText
            android:id="@+id/map_notes"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
           android:ems="10"
            android:inputType="textMultiLine"
            android:text="notes" />

        <Space
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <Button
                android:id="@+id/but_ClientForm"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Open Contract" />

            <Button
                android:id="@+id/but_saveData"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Save Changes" />
        </LinearLayout>


    </LinearLayout>

空间视图将展开,以便视图在设备上均匀分布。这不是一个神奇的子弹;你仍然需要看看视图如何在更大的屏幕上呈现,并找出它是否分散得太多。有时我会使用权重为1的Space s,在最底部放置一个重量为2或3的Space。在较大的屏幕上,这会在底部留下一些边距以便视图不要太过分散。

嵌套权重警告只是为了让您知道具有水平和垂直权重的布局可能需要更长时间才能呈现。同样,你必须确定什么对你有用。我不得不在我的一些布局上使用嵌套权重,并且我没有任何不可接受的渲染延迟。但YMMV一如既往。