2011-08-03 82 views
1

我觀察到一個行爲與la​​yout_weight,我無法解釋。以下是一個簡單的例子:安卓水平LinearLayout與TextView中的包裹文本

<?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添加android:layout_weight =「1」,那麼如果文本未被包裹,則存在間隙。)

任何幫助將不勝感激!

回答

0

希望這是你在找什麼。

首先,這裏是我發現的一個很好的資源,用於Creating UI's

  1. layout_weight - 指定佈局中多少額外空間分配給視圖。

  2. 如果要確保白色方塊始終位於textview的右側,則可以使用相對視圖並將該參數添加到視圖中。機器人:layout_alignRight = 「+ ID @ yourTextViewID」。這應該始終使該框顯示在textView區域旁邊。你應該也可以添加一些像android:maxWidth =「250px」這將確保你不會將白盒完全推出屏幕。

下面是一個代碼示例:

<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的。

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是一個很好的解決方案。

0
  1. 首先,我測試了我的其他答案的代碼,它完全符合你所描述的你想要的。 (除非我誤解你的要求)。你一定做不是想用android:layout_alignRight這是不是什麼是代碼示例。這隻會將該框放在屏幕的右側,而不會受到textview的影響。此示例使用android:layout_toRightOf="@+id/TextForWhiteBox",這可能是由於它是相對佈局。由於相對佈局允許您將對象與其他對象相關聯。該行將始終將該框放在textview的右側,沒有任何間隙。

  2. 至於屏幕方向的變化:

當方向改變它創建視圖的新實例。

這是一個簡單的解決方案。

//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; 

希望這會有所幫助!

如果這對您有所幫助,請點擊接受的按鈕。 =)乾杯!

相關問題