Android水平LinearLayout,在TextView中包含文本

时间:2011-08-03 06:22:19

标签: android android-layout android-linearlayout

我观察到layout_weight的行为无法解释。以下是一个简单的例子:

<?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="wrap_content"
    android:orientation="horizontal"
>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:text="This is a very very very very very very very very very very very very very very very long string." 
        android:layout_weight="1"
    />

    <View
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_gravity="center_vertical"
        android:background="#ffffffff"
    />

</LinearLayout>

在QVGA显示中,TextView包装文本。白色方块显示在文本的右侧。

但是,如果我从TextView中删除android:layout_weight =“1”,TextView现在会占用整个显示宽度。白色方块不再显示。

  1. 为什么TextView中的layout_weight会影响是否显示白色方块?不应该首先为白色背景的视图分配32dpx32dp吗? (如果视图是任何其他类型 - ImageView或TextView,则没有区别。
  2. 我正在处理的问题是我希望白色方块始终显示在TextView的右侧(无论文本是否被包装),但我不希望TextView和TextView之间有任何空白区域。白色方块。 (如果我将text:layout_weight =“1”添加到TextView中,那么如果没有包装文本则会有间隙。)
  3. 任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

回答我的问题#1:通过查看LinearLayout的来源我学到了一件事:layout_weight不仅为子节点分配了未使用的空间,如果子节点延伸到子节点之外,它还会缩小具有layout_weight的子节点LinearLayout的边界。这就解释了为什么带有包装文本的TextView在我的布局中缩小了。

关于我的问题#2的答案,我认为你的意思是android:toRigthOf而不是android:layout_alignRight。使用RelativeLayout而不是LinearLayout不会更改布局行为。棘手的部分是将视图立即放置在TextView的右侧,没有间隙,无论文本是否被包装。设置maxWidth会限制TextView的宽度,但该解决方案不会在纵向/横向和不同的显示尺寸上进行缩放。

解决方案 - 看起来Dyarish的解决方案是最好的解决方案。无论您使用何种布局,我的布局问题都存在。关键是为TextView设置maxWidth,使其不占用布局中的所有水平空间。因为在TextView中对android:maxWidth值进行硬编码不会在不同的显示中进行缩放,所以在Dyarish建议的运行时设置maxWidth是一个很好的解决方案。

答案 1 :(得分:0)

希望这就是你要找的东西。

首先,这是我为Creating UI's找到的一个很好的资源。

  1. layout_weight - 指定要分配给视图的布局中多少额外空间。

  2. 如果要确保白色方块始终位于文本视图的右侧,可以使用“相对视图”,并将参数添加到视图中。机器人:layout_alignRight = “+ ID @ yourTextViewID”。这应始终使框显示在textView区域旁边。你应该也可以添加像android这样的东西:maxWidth =“250px”这样可以确保你不会将白框完全推出屏幕。

  3. 以下是代码示例:

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
    >
    
        <TextView
            android:layout_width="wrap_content"
            android:maxWidth="250px"
            android:id="@+id/TextForWhiteBox"
            android:layout_height="wrap_content"
            android:layout_gravity="center|left"
            android:text="This is a very very very very very very very very very very very very very very very long string."   
        />
    
        <View android:background="#ffffffff" android:layout_width="32dp" android:layout_height="32dp" android:id="@+id/view1" android:layout_toRightOf="@+id/TextForWhiteBox"></View>
        </RelativeLayout>
    

    您还可以添加到视图:

    android:layout_alignTop="@+id/TextForWhiteBox" android:layout_alignBottom="@+id/TextForWhiteBox"

    使白框与TextView的大小相同。

答案 2 :(得分:0)

  1. 首先,我从其他答案中测试了代码,它完全按照您所描述的方式进行测试。 (除非我误解了你要求的东西)。你肯定会想要使用android:layout_alignRight,这是代码示例中的内容。这只是将框保持在屏幕的右侧,而不受文本视图的影响。此示例使用android:layout_toRightOf="@+id/TextForWhiteBox",这是可能的,因为它是相对布局。由于相对布局允许您将对象放置在与其他对象相关的位置。该行将始终将框放置在textview的右侧,没有间隙。

  2. 屏幕方向更改:

  3. 当方向改变时,它会创建一个新的视图实例。

    这是一个简单的解决方案。

    //Add to oncreate in your Activity
    
         private TextView textStatus;   
         textStatus = (TextView) findViewById(R.id.TextForWhiteBox); 
    
    
    // This get's the width of your display.
    DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
            int width = displaymetrics.widthPixels;
    
    // Now you know the screen orientation, and it's width. So just set the maxwidth of the text view to match the display width - the pixels of your white box. 
    
         textStatus.setMaxWidth(width - 32); // 32 is here because you already know the size of the white box. More logic is needed to dynamically get this value, because you would need to wait for the activity to be fully created.
    }
    

    这是我使用的main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
    
    >
        <TextView
            android:layout_width="wrap_content"
    
            android:id="@+id/TextForWhiteBox"
            android:layout_height="wrap_content"
            android:layout_gravity="center|left"
            android:text="This is a very very very very very very very very very very very very very very very very very very very long string."   
        />
    
        <View android:background="#ffffffff" android:layout_width="32px" android:layout_height="32px" android:id="@+id/view1" android:layout_toRightOf="@+id/TextForWhiteBox"></View>
        </RelativeLayout>
    

    您可能需要一些额外的逻辑来保持屏幕值。

    此代码已经过测试,你应该能够按照你的要求逐字复制并粘贴它。

    另外,根据您的逻辑,您可以使用类似的东西来返回屏幕方向。

    int orient = getResources().getConfiguration().orientation;
    

    希望这有帮助!

    如果这对您有所帮助,请单击“接受”按钮。 =)干杯!