多行按钮打破Dialog的宽度计算

时间:2014-06-24 14:58:52

标签: android dialog android-linearlayout

我的应用中出现了一个难看的错误,我不知道如何修复它。首先看这两个截图:

enter image description here

正如您可能看到的那样,有一个文本太大的按钮,因此它包裹(文本被剪切在这里无关紧要)。我猜这个文本会导致LinearLayout中的计算错误:我在其中一个测量步骤中都是累积的宽度,宽度将大于可用空间,因此它只需要采用孔宽度而不是使用可用宽度和将它分成所有元素。

这是我的xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="@dimen/list_item_height"
        android:textSize="18sp"
        android:gravity="center_vertical"
        android:text="Test 1"
        android:paddingLeft="@dimen/dialog_horizontal_margin"
        android:paddingRight="@dimen/dialog_horizontal_margin"/>

    <LinearLayout
        style="@style/SlideButtonContainer"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="yes"/>

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="no"/>

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="maybe"/>

    </LinearLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="@dimen/list_item_height"
        android:textSize="18sp"
        android:gravity="center_vertical"
        android:paddingLeft="@dimen/dialog_horizontal_margin"
        android:paddingRight="@dimen/dialog_horizontal_margin"
        android:text="Test 2"/>

    <LinearLayout
        style="@style/SlideButtonContainer"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="one"/>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="more then one million"/>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="infinity"/>
    </LinearLayout>
</LinearLayout>

最后这是缺少的风格:

<style name="SlideButtonContainer">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:paddingLeft">@dimen/dialog_horizontal_margin</item>
    <item name="android:paddingRight">@dimen/dialog_horizontal_margin</item>
    <item name="android:background">#44000000</item>
    <item name="android:baselineAligned">false</item>
</style>

你们有没有想法如何解决这个布局问题?

2 个答案:

答案 0 :(得分:0)

我的项目中遇到了类似的问题。我的解决方案是添加一个包装线性布局并为其分配权重。在内部按钮上,我只需将宽度和高度设置为match_parent。我将根布局宽度包装为内容,因此具有大文本的按钮占用最大空间,该空间将是父级的高度。其他较小的按钮只会延伸到可用高度。代码应该更清楚地解释它:

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

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

        <Button
            android:id="@+id/button1"       
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"       
        android:orientation="vertical" >
        android:layout_weight="1"
        <Button
            android:id="@+id/button2"          
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>

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

        <Button
            android:id="@+id/button3"            
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
</LinearLayout>

答案 1 :(得分:0)

我找到了一个安静的简单解决方案。因为我知道文本将被包装在哪里,所以我只在字符串中添加了\n,因此宽度的计算是固定的。根本不是一个解决方案,而是一个没有黑客攻击的好方法。