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">
【讨论】:
还是同样的问题 像下面的代码一样让滚动查看你的布局父级对 xml 文件中的所有组件使用 weightSum,
它是android:layout_weight
。权重只能在 LinearLayout 中使用。如果linearlayout的方向是Vertical,那么使用android:layout_height="0dp"
,如果方向是horizontal,那么使用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。您必须输入类似 <LinearLayout weightsum=15>
(您不必输入 15)的内容,然后您必须分发布局中的内容你的 15 总和。就像<TextView layout_weight=1>
这意味着你的textview
将是1/15。当我使用权重时,我还将高度或宽度设置为 0dp,具体取决于我想玩哪一个。例如,如果我想在宽度上玩<TextView width=0dp height=wrap_content weight=1>
。因此,您必须重视LinearLayout
的每个孩子。
希望对您有所帮助。
编辑:ScrollView 中的 ListView 也不是一个好主意,可以来自这里。看这个帖子: How can I put a ListView into a ScrollView without it collapsing?
【讨论】:
在滚动视图中添加这些行以上是关于Android XML切断了布局的下半部分的主要内容,如果未能解决你的问题,请参考以下文章