Android XML切断了布局的下半部分

Posted

技术标签:

【中文标题】Android XML切断了布局的下半部分【英文标题】:Android XML cutting off bottom half of layout 【发布时间】:2016-06-02 00:43:45 【问题描述】:

我的 XML 布局有问题,我认为这不会给我带来很多问题。我在滚动视图下方有一个布局,但 布局的底部被切断,我看不到第二个列表视图之外的任何内容。环顾四周,我似乎看不出 xml 本身有什么问题,也看不出我做错了什么。

我已经尝试了这个问题的建议,即为每个不同的元素添加权重,但这仍然没有解决问题。

我还添加了放置片段的主要活动,以防可能有助于解决问题

片段 XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_
android:layout_
android:id="@+id/coordinatorLayout">
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:fillViewport="true"
    android:scrollbars="vertical">
    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical">
        <android.support.design.widget.TextInputLayout
            android:id="@+id/text_input_layout"
            android:layout_
            android:layout_
            android:layout_weight="1">

            <EditText
                android:id="@+id/editText"
                android:layout_
                android:layout_
                android:hint="Recipe Title"/>
        </android.support.design.widget.TextInputLayout>

        <TextView
            android:id="@+id/ingredientsHeading"
            android:layout_below="@+id/text_input_layout"
            android:layout_
            android:layout_
            android:text="Ingredients"
            android:textStyle="bold|italic"
            android:layout_weight="1" />
        <ListView
            android:id="@+id/ingredientsList"
            android:layout_below="@+id/ingredientsHeading"
            android:layout_above="@+id/directionsHeading"
            android:layout_
            android:layout_
            android:layout_weight="1"></ListView>

        <Button style="@style/Button"
            android:layout_
            android:layout_
            android:text="Add Ingredient"
            android:id="@+id/addIngredient"
            android:layout_below="@+id/ingredientsList"
            android:enabled="true"
            android:layout_gravity="center_horizontal"
            android:layout_weight="1" />

        <TextView
            android:id="@+id/directionsHeading"
            android:layout_below="@+id/addIngredient"
            android:layout_
            android:layout_
            android:text="Directions"
            android:textStyle="bold|italic"
            android:layout_weight="1" />
        <ListView
            android:id="@+id/directionsList"
            android:layout_below="@+id/directionsHeading"
            android:layout_
            android:layout_
            android:layout_weight="1"></ListView>

        <Button style="@style/Button"
            android:layout_
            android:layout_
            android:text="Add Direction"
            android:id="@+id/addDirection"
            android:layout_below="@+id/ingredientsList"
            android:enabled="true"
            android:layout_gravity="center_horizontal"
            android:layout_weight="1" />

    </LinearLayout>

</ScrollView>


<android.support.design.widget.FloatingActionButton
    android:id="@+id/filterButton"
    app:backgroundTint="@color/floatingButton"
    android:layout_
    android:layout_
    android:layout_gravity="bottom|right"
    android:clickable="true"
    android:src="@drawable/ic_filter"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true"
    android:layout_marginBottom="63dp"
    android:layout_marginRight="16dp" />


</android.support.design.widget.CoordinatorLayout>

主要 XML

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_
android:layout_>
<!-- The main content view -->

<android.support.design.widget.CoordinatorLayout
    android:layout_
    android:layout_
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout2">

    <android.support.design.widget.AppBarLayout
        android:layout_
        android:layout_
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_
            android:layout_
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_
            android:layout_
            app:tabMode="fixed"
            app:tabGravity="fill"/>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_
        android:layout_
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <FrameLayout
        android:id="@+id/container_body"
        android:layout_
        android:layout_
        android:layout_weight="1" />

</android.support.design.widget.CoordinatorLayout>


<fragment
    android:id="@+id/fragment_navigation_drawer"
    android:name="com.example.rory.pocketchef.Fragments.FragmentDrawer"
    android:layout_
    android:layout_
    android:layout_gravity="start"
    app:layout="@layout/fragment_navigation_drawer"
    tools:layout="@layout/fragment_navigation_drawer" />

</android.support.v4.widget.DrawerLayout>

【问题讨论】:

请发截图... 您不应该使用嵌套权重。 Android studio 一定警告过你,而且 weight 永远不会超过 weightsum 【参考方案1】:

我解决了这个问题。当滚动视图显示时,底部被实际手机上的底部操作栏截断。所以为了解决这个问题,我在滚动视图的底部添加了填充,以便将其推回操作栏上方。

新的布局如下

更新的工作 XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_
android:layout_
android:id="@+id/coordinatorLayout">
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:fillViewport="true"
    android:scrollbars="vertical"
    android:paddingBottom="?android:attr/actionBarSize"> <<<-------added this line
    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical">
        <android.support.design.widget.TextInputLayout
            android:id="@+id/text_input_layout"
            android:layout_
            android:layout_
            android:layout_weight="1">

            <EditText
                android:id="@+id/editText"
                android:layout_
                android:layout_
                android:hint="Recipe Title"/>
        </android.support.design.widget.TextInputLayout>

        <TextView
            android:id="@+id/ingredientsHeading"
            android:layout_below="@+id/text_input_layout"
            android:layout_
            android:layout_
            android:text="Ingredients"
            android:textStyle="bold|italic"
            android:layout_weight="1" />
        <ListView
            android:id="@+id/ingredientsList"
            android:layout_below="@+id/ingredientsHeading"
            android:layout_above="@+id/directionsHeading"
            android:layout_
            android:layout_
            android:layout_weight="1"></ListView>

        <Button style="@style/Button"
            android:layout_
            android:layout_
            android:text="Add Ingredient"
            android:id="@+id/addIngredient"
            android:layout_below="@+id/ingredientsList"
            android:enabled="true"
            android:layout_gravity="center_horizontal"
            android:layout_weight="1" />

        <TextView
            android:id="@+id/directionsHeading"
            android:layout_below="@+id/addIngredient"
            android:layout_
            android:layout_
            android:text="Directions"
            android:textStyle="bold|italic"
            android:layout_weight="1" />
        <ListView
            android:id="@+id/directionsList"
            android:layout_below="@+id/directionsHeading"
            android:layout_
            android:layout_
            android:layout_weight="1"></ListView>

        <Button style="@style/Button"
            android:layout_
            android:layout_
            android:text="Add Direction"
            android:id="@+id/addDirection"
            android:layout_below="@+id/ingredientsList"
            android:enabled="true"
            android:layout_gravity="center_horizontal"
            android:layout_weight="1" />

        <RelativeLayout
            android:layout_
            android:layout_
            android:gravity="center"
            android:layout_below="@+id/addDirection">

            <Button style="@style/Button"
                android:layout_
                android:layout_
                android:text="Add Direction"
                android:id="@+id/showOptionsDialog"
                android:enabled="true"
                android:layout_gravity="center_horizontal"
                android:layout_weight="1" />

            <Button style="@style/Button"
                android:layout_
                android:layout_
                android:text="Add Direction"
                android:id="@+id/saveRecipe"
                android:enabled="true"
                android:layout_gravity="center_horizontal"
                android:layout_toRightOf="@+id/showOptionsDialog"
                android:layout_weight="1" />


        </RelativeLayout>

    </LinearLayout>

</ScrollView>


<android.support.design.widget.FloatingActionButton
    android:id="@+id/filterButton"
    app:backgroundTint="@color/floatingButton"
    android:layout_
    android:layout_
    android:layout_gravity="bottom|right"
    android:clickable="true"
    android:src="@drawable/ic_filter"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true"
    android:layout_marginBottom="63dp"
    android:layout_marginRight="16dp" />


</android.support.design.widget.CoordinatorLayout>

【讨论】:

它将从底部提供两个填充,而不是我们可以在高度为 2dp 的主 xml 的底部有一个不可见的视图,并告诉滚动视图高于该视图。然后这个问题也将得到解决。【参考方案2】:

在你的 ScrollView 中添加这些行

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:fillViewport="true"

android:scrollbars="vertical">

【讨论】:

还是同样的问题 像下面的代码一样让滚动查看你的布局父级 schemas.android.com/apk/res/android" android:layout_ android:layout_ android:fillViewport="true" android:scrollbarStyle="insideInset" android:scrollbars="vertical"> 【参考方案3】:

对 xml 文件中的所有组件使用 weightSum

它是android:layout_weight。权重只能在 LinearLayout 中使用。如果linearlayout的方向是Vertical,那么使用android:layout_height="0dp",如果方向是horizo​​ntal,那么使用android:layout_width = "0dp ”。它会完美运行。

根据您的问题-布局的底部被切断

这是因为组件的高度是固定的。

编辑——添加了xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:padding="5dp"
    tools:context="info.androidhive.materialtabs.fragments.OneFragment">

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_
        android:layout_
        android:fadingEdge="none"
        android:fillViewport="true"
        android:isScrollContainer="true"
        android:scrollbars="none">

        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical"
            android:weightSum="10">

            <LinearLayout
                android:layout_
                android:layout_
                android:layout_weight="1">

                <android.support.design.widget.TextInputLayout
                    android:id="@+id/text_input_layout"
                    android:layout_
                    android:layout_>

                    <EditText
                        android:id="@+id/editText"
                        android:layout_
                        android:layout_
                        android:hint="Recipe Title" />
                </android.support.design.widget.TextInputLayout>
            </LinearLayout>

            <LinearLayout
                android:layout_
                android:layout_
                android:layout_weight="3.5"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/ingredientsHeading"
                    android:layout_
                    android:layout_
                    android:padding="5dp"
                    android:text="Ingredients"
                    android:textStyle="bold|italic" />

                <ListView
                    android:id="@+id/ingredientsList"
                    android:layout_
                    android:layout_ />
            </LinearLayout>

            <LinearLayout
                android:layout_
                android:layout_
                android:layout_weight="1"
                android:gravity="center">

                <Button
                    android:id="@+id/addIngredient"
                    style="@style/AppTheme"
                    android:layout_
                    android:layout_
                    android:layout_gravity="center_horizontal"
                    android:enabled="true"
                    android:text="Add Ingredient" />

            </LinearLayout>

            <LinearLayout
                android:layout_
                android:layout_
                android:layout_weight="3.5"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/directionsHeading"
                    android:layout_
                    android:layout_
                    android:padding="5dp"
                    android:text="Directions"
                    android:textStyle="bold|italic" />

                <ListView
                    android:id="@+id/directionsList"
                    android:layout_
                    android:layout_ />

            </LinearLayout>

            <LinearLayout
                android:layout_
                android:layout_
                android:layout_weight="1"
                android:gravity="center">

                <Button
                    android:id="@+id/addDirection"
                    style="@style/AppBaseTheme"
                    android:layout_
                    android:layout_
                    android:layout_gravity="center_horizontal"
                    android:enabled="true"
                    android:text="Add Direction" />
            </LinearLayout>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

【讨论】:

我应该为 XML 的所有元素更改 android:layout_height 吗? 是的,如果你根据android:layout_weight改变xml而不是改变所有组件的高度。 这里你给定了固定高度,所以它不会显示到整个屏幕。 抱歉回复晚了,但不是我仍然有同样的问题,要求你重做我的 XML 会不会太过分了?我似乎根本无法做到这一点 请检查我编辑的答案。只需将其复制到您的布局中,我已经完成了所有@JJSmith【参考方案4】:

您将 weightsum 设为 1,而您的 scrollview 为 28。您必须输入类似 &lt;LinearLayout weightsum=15&gt;(您不必输入 15)的内容,然后您必须分发布局中的内容你的 15 总和。就像&lt;TextView layout_weight=1&gt; 这意味着你的textview 将是1/15。当我使用权重时,我还将高度或宽度设置为 0dp,具体取决于我想玩哪一个。例如,如果我想在宽度上玩&lt;TextView width=0dp height=wrap_content weight=1&gt;。因此,您必须重视LinearLayout 的每个孩子。 希望对您有所帮助。

编辑:ScrollView 中的 ListView 也不是一个好主意,可以来自这里。看这个帖子: How can I put a ListView into a ScrollView without it collapsing?

【讨论】:

在滚动视图中添加这些行

以上是关于Android XML切断了布局的下半部分的主要内容,如果未能解决你的问题,请参考以下文章

如何创建仅在上半部分或下半部分带有圆角的布局?

垂直布局组自动扩展

我应该使用啥约束来让图像视图方面填充其父视图的下半部分?

在 thumb2 中设置寄存器的下半部分

从笔记本电脑移动到监控 Javascript/AngularJS 时屏幕被切断

android 开发布局:如何在屏幕下方显示一排按钮