Android: як зробити так, щоб подання зростало, щоб заповнити доступний простір?


90

Це здається просто, але я не можу зрозуміти, як це зробити. У мене горизонтальний макет із EditText та двома кнопками ImageButtons. Я хочу, щоб ImageButtons мали фіксований розмір, а EditText займав залишок місця в макеті. Як цього можна досягти?

<LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content">
        <EditText 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </EditText>
        <ImageButton 
            android:src="@drawable/img1"
            android:layout_width="50dip" 
            android:layout_height="50dip">
        </ImageButton>
        <ImageButton 
            android:src="@drawable/img2"
            android:layout_width="50dip" 
            android:layout_height="50dip">
        </ImageButton>
</LinearLayout>

Відповіді:


51

спробуйте це у відносному макеті

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content">
    <ImageButton 
        android:id="@+id/btn1"
        android:src="@drawable/icon"
        android:layout_width="50dip" 
        android:layout_height="50dip"
        android:layout_alignParentRight="true"/>
    <ImageButton 
        android:id="@+id/btn2"
        android:src="@drawable/icon"
        android:layout_width="50dip" 
        android:layout_height="50dip"
        android:layout_toLeftOf="@+id/btn1"/>
    <EditText 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/btn2">
    </EditText>

</RelativeLayout>

4
Дякую. Це чудово працює. (За винятком того, що ImageButtons повинні бути визначені перед EditText, як зазначив Джозеф).
ab11

1
fill_parent - ця константа застаріла, починаючи з рівня API 8 і замінюється на {@code match_parent}.
Zon

147

Якщо ви хочете, щоб макет залишився незмінним (тобто кнопки після тексту), використовуйте layout_weightвластивість разом із fill_parentтаким чином:

<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content">
    <EditText 
        android:layout_weight="1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </EditText>
    <ImageButton 
        android:src="@drawable/img1"
        android:layout_width="50dip" 
        android:layout_height="50dip">
    </ImageButton>
    <ImageButton 
        android:src="@drawable/img2"
        android:layout_width="50dip" 
        android:layout_height="50dip">
    </ImageButton>
 </LinearLayout>

Надання EditText«ваги» дає змогу зрозуміти останнє і надає перевагу кнопкам. Пограйте з різними вагами layout_weights і подивіться, як багато ви можете отримати задоволення!


1
Дякую. У мене в макеті 3 області (заголовки, вміст - WebView та нижній колонтитул), він вирішив проблему, встановивши WebView layout_weight = 1 та нижній колонтитул = 0.
MKK

Не знав фокусу з встановленням ваги та 0dp лише для однієї дитини .. Дякую!
Marcel Bro

1
це взагалі вважається найкращою практикою? Цікаво, що ви можете впливати на порядок, в якому андроїд вирішує думки.
Cypress Frankenfeld

2
ширина повинна бути
дотримана

19

Добре:

<RelativeLayout 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content">

        <ImageButton 
            android:id="@+id/button1"
            android:src="@drawable/img1"
            android:layout_width="50dip"
            android:layout_alignParentTop="true" 
            android:layout_height="50dip">
        </ImageButton>
        <ImageButton 
            android:src="@drawable/img2"
            android:layout_width="50dip" 
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@id/button1"
            android:layout_height="50dip">
        </ImageButton>
        <EditText 
            android:layout_below="@id/button"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent">
        </EditText>
</RelativeLayout>

Ключовими моментами макета є:

  • Елементи з фіксованим розміром розміщуються першими в макеті, таким чином, коли Android підходить до обчислення висоти висоти речей за допомогою fill_parent згодом у файлі враховується лише залишок місця, а не весь простір, який він міг би зайняти, якщо нічого іншого там не було
  • Висота EditText становить fill_parent( match_parentу 2,2+), щоб вона займала решту доступного місця

Вибачте, але ваше питання буде достатньо прочитаним. Наведений вище код дає відповідь, якщо ви хочете зробити це вертикально. Для горизонтального макету повинен працювати код, розміщений @Sunil.


Дякую Джозефу. Це справді працює. Хоча, я віддав належне Сунілу за те, що він трохи швидший.
ab11

13

Використовуйте встановіть layout_widthабо layout_heightна 0dp(За орієнтацією, яку потрібно заповнити, що залишилося). Потім використовуйте, layout_weightщоб він заповнив залишок місця.

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