Вага макета 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>

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>

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 висота заповнення + вага

LinearLayout висота заповнення + вага

LinearLayout висота заповнення + вага

EndLinearLayout

Що працювало було

RelativeLayout

LinearLayout вертикальний

LinearLayout висота заповнення + вага

LinearLayout висота заповнення + вага

LinearLayout висота заповнення + вага

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.