Декларативно назначить ширину половине доступной ширины экрана


113

Можно ли присвоить ширине виджета половину доступной ширины экрана и сделать это с помощью декларативного xml?

Ответы:


274

Если ваш виджет - кнопка:

<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>

Я предполагаю, что вы хотите, чтобы ваш виджет занимал одну половину, а другой виджет занимал вторую половину. Хитрость заключается в использовании LinearLayout, который настраивается layout_width="fill_parent"на обоих виджетах, а также устанавливается layout_weightодинаковое значение для обоих виджетов. Если есть два виджета, оба с одинаковым весом, LinearLayout разделит ширину между двумя виджетами.


15
Лучше использовать android: layout_width = "0dp" для обоих дочерних элементов, избегая их двойного изменения размера.
tomash

2
Я так и не понял, почему вам нужно было объявить layout_width = "0dp"
Эндрю

Вы также можете использовать <Space /> в более поздних версиях Android в качестве наполнителей. Я думаю, что View немного легче, чем TextView, если вы просто собираетесь использовать его как заполнитель. layout_width = "0dp" - фактически рекомендуемый подход согласно документации Android.
Muz

Прекрасно работает! Огромное спасибо!!
IcyFlame

1
@Andrew: поскольку таким образом средство визуализации макета не пытается работать с layout_width компонента, он сразу переходит к разделению дополнительной ширины в соответствии с весами.
njzk2

43

Использование макета ограничений

  1. Добавить руководство
  2. Установите процент на 50%
  3. Ограничьте свой взгляд Руководящим принципом и родителем.

введите описание изображения здесь

Если у вас возникли проблемы с изменением его на процент, посмотрите этот ответ .

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>

Это должен быть лучший ответ.
Жан Эрик,

15

задайте ширину как 0dp, чтобы убедиться, что его размер точно соответствует его весу, это гарантирует, что даже если содержимое дочерних представлений станет больше, они все равно будут ограничены ровно половиной (в зависимости от веса)

<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
Я думаю, что android: layout_width = "0dp" правильный, но установка каждого веса на 0,5 и weitghtSum на их сумму не требуется. Похоже, вам просто нужно иметь одинаковый вес для обоих дочерних представлений ..
jj_

5

Другой способ для одного элемента в центре, который заполняет половину экрана:

<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
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода.
gunr2171
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.