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?

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.


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>

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>

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>

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>

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.