没有显示layout_weight = 0的Android布局wrap_content

时间:2019-04-02 06:47:31

标签: android android-layout android-layout-weight

我正在尝试使用嵌入式Google地图片段以及有关地图下方选定标记的一些信息来创建布局。我希望地图下方的信息仅占用其所需的空间,并将其余空间留给地图。

据我了解,layout_weight为不同的小部件分配额外的空间,这些空间与给定的值成比例。因此,如果我有一个带有layout_weight = 1的小部件,而另一个带有layout_weight = 0的小部件,则第一个小部件将占用所有多余的空间,第二个小部件将仅占用所需的空间。因此,如果我给第二个小部件layout_height = wrap_content,那么我应该得到想要的东西。但是,在实践中似乎并非如此。我更改了很多值,或者其中一个小部件占据了所有空间,或者一个都不占据任何空间。使它们正常显示的唯一方法是将第二个小部件的layout_height设置为特定值。

这可能是问题的一部分,但是我正在动态填充小部件map_frag_event_iconmap_frag_personmap_frag_event_details


layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_margin="@dimen/fragment_margins"
    android:orientation="vertical">

    <fragment
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:id="@+id/map_frag_google_map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:paddingBottom="@dimen/fragment_margins"
        tools:context=".fragment.MapFragment"/>

    <LinearLayout
        android:id="@+id/map_frag_event_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:orientation="horizontal"
        android:gravity="center_vertical">

        <ImageView
            android:id="@+id/map_frag_event_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="@dimen/icon_padding"
            android:layout_weight="0" />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical"
            android:gravity="center_vertical">

            <TextView
                android:id="@+id/map_frag_event_person"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="@dimen/text_size"/>

            <TextView
                android:id="@+id/map_frag_event_details"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="@dimen/text_size"/>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

strings.xml

<resources>
    <string name="app_name">Family Map</string>
    <string name="title_activity_maps">Map</string>

    <dimen name="fragment_margins">8dp</dimen>
    <dimen name="horizontal_layout_padding">8dp</dimen>
    <dimen name="vertical_layout_padding">4dp</dimen>
    <dimen name="icon_size">48sp</dimen>
    <dimen name="icon_padding">8dp</dimen>
    <dimen name="text_size">20sp</dimen>
    <dimen name="small_text_size">14sp</dimen>
    <dimen name="large_text_size">24sp</dimen>

    <dimen name="map_event_layout_height">120sp</dimen>
    <dimen name="map_event_icon_size">40sp</dimen>

</resources>

编辑

这是我要寻找的常规设计,但是我希望文本的空白区域尽可能小,并且我想创建一个设置来更改文本大小,因此底部的空白区域应为动态的。

如果可以的话,请说明解决方案。

5 个答案:

答案 0 :(得分:0)

在片段中保留android:layout_weight="1",但在LinearLayout中应用android:layout_weight="0.5"。检查结果,然后根据需要更改值。把它看成是关系百分比,所以1到0.5就是66%到33%

答案 1 :(得分:0)

尝试以下布局:          

    <fragment xmlns:map="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/map_frag_google_map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/map_frag_event_layout"
        android:paddingBottom="@dimen/fragment_margins"
        tools:context=".fragment.MapFragment" />

    <LinearLayout
        android:id="@+id/map_frag_event_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/map_frag_event_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:padding="@dimen/icon_padding" />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:orientation="vertical">

            <TextView
                android:id="@+id/map_frag_event_person"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="@dimen/text_size" />

            <TextView
                android:id="@+id/map_frag_event_details"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="@dimen/text_size" />

        </LinearLayout>

    </LinearLayout>

</RelativeLayout>

答案 2 :(得分:0)

尝试以下代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="@dimen/fragment_margins"
    android:orientation="vertical">

    <fragment
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:id="@+id/map_frag_google_map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:id="@+id/map_frag_google_map"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:paddingBottom="@dimen/fragment_margins"
        tools:context=".fragment.MapFragment" />

    <LinearLayout
        android:id="@+id/map_frag_event_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/map_frag_event_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="@dimen/icon_padding"
            android:src="@mipmap/ic_launcher" />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:orientation="vertical">

            <TextView
                android:id="@+id/map_frag_event_person"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="@dimen/text_size" />

            <TextView
                android:id="@+id/map_frag_event_details"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="@dimen/text_size" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

答案 3 :(得分:0)

以此替换您的xml代码,

>

您正在将两个视图的权重都设置为1。所以

答案 4 :(得分:0)

我发现我发布的原始代码存在两个问题。我不知道在最初的测试中何时添加它,但是有两个致命错误。在根LinearLayout中,我有layout_height = "0dp",应该是layout_height = "match_parent"。在包含两个LinearLayout的{​​{1}}中,我有TextViews,应该是layout_height = "match_parent"

在修正了这两个错误之后,@ MuhammadMuzammilSharif关于删除layout_height = "wrap_content"的原始评论奏效了。


layout.xml

layout_weight = "0"