Вес макета Android

84

Я новичок в разработке Android, и у меня есть вопрос о настройке веса в линейном макете.

Я пытаюсь создать строку с двумя настраиваемыми кнопками и настраиваемым текстом редактирования. Текст редактирования должен занимать ровно столько места, сколько его содержимое, а две кнопки должны расширяться по горизонтали, чтобы заполнить оставшееся доступное пространство в строке. Как это...

| [#Button++#] [#Button--#] [et] |

После нескольких попыток это самое близкое к тому, что я могу получить, хотя это кажется слишком сложным.

| [Button] [Button] [###ET###] |

<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal|center_vertical"
    android:layout_weight="1"
    >

    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_plus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_plus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/tv_dice_plus" 
                android:text="@string/tv_plus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_minus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_minus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/btn_minus" 
                android:text="@string/tv_minus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <EditText 
            android:textColor="#FAFAF4"
            android:text="@string/et_output" 
            android:id="@+id/et_output" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:inputType="number"
            android:selectAllOnFocus="true" 
            android:minWidth="50sp"         
            android:maxWidth="50sp"
            android:background="@drawable/tv_black_background3"
            android:textColorHighlight="#c30505"
            ></EditText>
    </LinearLayout>
</LinearLayout>

Насколько я понимаю, установка [android: layout_weight = "2"] для линейных макетов, удерживающих кнопки, должна заставить их занимать больше места, чем редактируемый текст, но для меня это делает обратное, делая их вдвое меньше.

| [Btn] [Btn] [#####et#####] |

Я перепробовал столько разных комбинаций, что даже не могу их вспомнить, и ни одна из них не сработала.

НеудачныйДьявол
источник

Ответы:

213

Это не работает, потому что вы используете fill_parent в качестве ширины. Вес используется для распределения оставшегося пустого пространства или удаления пространства, когда общая сумма больше, чем LinearLayout. Вместо этого установите ширину на 0dip, и она будет работать.

Ромен Гай
источник
6
Установка ширины линейных макетов на 0dip работала так, как я хотел. Я не знал, что это вариант. Имеет смысл, почему это сработает там, где wrap_content нет. Установка ширины на wrap_content, когда нет содержимого, заставляет его исчезнуть, но установка на 0dip позволяет растягиваться от нуля до любого размера, который он должен быть. Большое спасибо.
UnluckyDevil
Установка layout_width на "fill_parent" и layout_weight на значение с плавающей запятой, такое как "0.2", "0.85" и т. Д., Также работает. В этом случае, чем больше число, тем меньше размер изображения. не могли бы вы объяснить, является ли это приемлемым способом?
Яр
37
Это сработало и для меня. Спасибо. (Хотя я должен сказать, кто-нибудь еще находит систему компоновки Android странной и неинтуитивной?)
tstyle
Благодаря! У меня действительно были проблемы с объяснением, почему ширина моего макета не отображается должным образом. Это была настройка 0dip :)
marlar
@tstyle android - это просто, если вы хотите делать простые вещи. Однако если вы хотите делать больше, чем просто, это становится слишком сложно.
Pacerier
14

android:Layout_weight можно использовать, когда вы уже не добавляете фиксированное значение к своей ширине, например fill_parent и т. д.

Сделайте что-нибудь вроде этого:

<Button>

Android:layout_width="0dp"
Android:layout_weight=1

-----other parameters
</Button>
learn_andrd
источник
7

Думайте так, будет проще

Если у вас 3 кнопки и их вес 1,3,1 соответственно, это будет работать как таблица в HTML.

Предусмотрите 5 частей для этой линии: 1 часть для кнопки 1, часть 3 для кнопки 2 и 1 часть для кнопки 1.

Джордж Нгуен
источник
3

В linearLayout установите WeightSum = 2;

И распределите вес его дочерним элементам, как вы хотите, чтобы они отображались. Я дал вес = "1" дочернему элементу. Таким образом, оба распределят половину суммы.

 <LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="2"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/maila_oss" />
</LinearLayout>
AndroidGeek
источник
2

значения веса 0-1 разделяют распределение доступного пространства (после установки layout_width = "0px") пропорционально значению веса. Элементы просмотра с не указанным весом (без ввода веса) получают вес 0, что означает, что они не расширяются.

Простая альтернатива, не требующая ввода веса, - это прикрепить область к представлению с текстом, который сообщает ему о расширении от минимально необходимого для текста (wrap_content) до доступного пространства EditText: android: layout_width = "wrap_content" android: ellipsize = "marquee"

Дж. Д. Перлман
источник
0

Я бы предположил, что установить EditTextширину s wrap_contentи поместить две кнопки в LinearLayout, ширина fill_parentи вес которого установлены на 1.

Джонатан Рот
источник
0

Еще одну причину я нашел (как бы расплывчато это ни звучало). Ниже не сработало.

LinearLayout по вертикали

LinearLayout высота fillparent + вес

LinearLayout высота fillparent + вес

LinearLayout высота fillparent + вес

EndLinearLayout

Что работало, было

RelativeLayout

LinearLayout по вертикали

LinearLayout высота fillparent + вес

LinearLayout высота fillparent + вес

LinearLayout высота fillparent + вес

EndLinearLayout

EndRelativeLayout

Это звучит расплывчато из-за корневого макета с Linear, и веса под ним не работали. И когда я говорю «не сработало», я имею в виду, что после того, как я просмотрел графический макет между разными разрешениями, согласованность экрана сильно нарушилась.

Сиддхартх
источник
0
<LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="9"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
<EditText
        android:id="@+id/edittxt"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
</LinearLayout>
Девендра Шах
источник