Przypisz szerokość do połowy dostępnej szerokości ekranu deklaratywnie

113

Czy można przypisać szerokość widżetu do połowy dostępnej szerokości ekranu i zrobić to za pomocą deklaratywnego XML?

bugzy
źródło

Odpowiedzi:

274

Jeśli Twój widżet jest przyciskiem:

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="2"
    android:orientation="horizontal">
    <Button android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="somebutton"/>

    <TextView android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
</LinearLayout>

Zakładam, że chcesz, aby Twój widget zajmował jedną połowę, a inny widżet zajmował drugą połowę. Sztuczka polega na użyciu LinearLayout, ustawieniu layout_width="fill_parent"obu widżetów i ustawieniu layout_weighttej samej wartości również w obu widżetach. Jeśli istnieją dwa widgety, oba o tej samej wadze, LinearLayout podzieli szerokość między dwa widżety.

synic
źródło
15
Lepiej użyj androida: layout_width = "0dp" dla obu elementów podrzędnych, unikając ich dwukrotnego zmieniania.
tomasz
2
Nigdy nie zrozumiałem, dlaczego musisz zadeklarować layout_width = "0dp"
Andrew
Możesz także użyć <spacji /> w nowszych wersjach Androida jako wypełniaczy. Myślę, że View jest trochę lżejszy niż TextView, jeśli zamierzasz go używać jako wypełniacza. layout_width = "0dp" jest właściwie zalecanym podejściem zgodnie z dokumentacją Androida.
Muz
Działa świetnie! Dziękuję bardzo!!
IcyFlame
1
@Andrew: ponieważ w ten sposób renderer układu nie próbuje pracować z layout_width komponentu, przeskakuje bezpośrednio do udostępniania dodatkowej szerokości zgodnie z wagami.
njzk2
43

Korzystanie z układu ograniczeń

  1. Dodaj wytyczne
  2. Ustaw procent na 50%
  3. Ogranicz swój widok do Wytycznych i rodzica.

wprowadź opis obrazu tutaj

Jeśli masz problem ze zmianą wartości procentowej, zobacz tę odpowiedź .

XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="81dp">

    <android.support.constraint.Guideline
        android:id="@+id/guideline8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5"/>

    <TextView
        android:id="@+id/textView6"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="TextView"
        app:layout_constraintBottom_toTopOf="@+id/guideline8"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
    
</android.support.constraint.ConstraintLayout>
Suragch
źródło
To powinna być najlepsza odpowiedź.
Jean Eric
15

podaj szerokość jako 0dp, aby upewnić się, że jego rozmiar jest dokładnie taki sam jak jego waga, dzięki temu upewnisz się, że nawet jeśli zawartość widoków potomnych wzrośnie, nadal będą ograniczone do dokładnie połowy (zgodnie z wagą)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1"
     >

    <Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="click me"
    android:layout_weight="0.5"/>


    <TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Hello World"
    android:layout_weight="0.5"/>
  </LinearLayout>
Rajesh Batth
źródło
1
Myślę, że android: layout_width = "0dp" jest poprawny, ale ustawienie każdej wagi na 0.5 i weitghtSum na ich sumę nie jest potrzebne. Wygląda na to, że po prostu musisz mieć taką samą wagę na obu widokach dzieci ..
jj_
5

Inny sposób na pojedynczy element na środku, który wypełnia połowę ekranu:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:visibility="invisible" />

        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2" />

       <View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:visibility="invisible" />

</LinearLayout>
Denys_Sh
źródło
1
<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
    android:id="@+id/textD_Author"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:text="Author : "
    android:textColor="#0404B4"
    android:textSize="20sp" />
 <TextView
    android:id="@+id/textD_Tag"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:text="Edition : "
    android:textColor="#0404B4"
    android:textSize="20sp" />
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:weightSum="1" >
    <Button
        android:id="@+id/btbEdit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="Edit" />
    <Button
        android:id="@+id/btnDelete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="Delete" />
</LinearLayout>
</LinearLayout>
Shahzad Shameer
źródło
3
Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod.
gunr2171