Можно ли создать фиксированную ширину в XML?

Я пытаюсь упростить некоторые графики, требуя 9-патча для каждой плотности, просто используя XML-drawable. Это довольно простая графика:

9-patch drawable

2 Сегменты:

  • 8dp для обоих сегментов
  • Верхний сегмент 2dp tall
  • Нижний сегмент заполняет представление
  • Правая сторона заполнена прозрачностью

Предоставление этого результата при установке в качестве фонового изображения:

9-patch as list item example

Похоже, что это должно быть довольно просто воссоздать как XML-чертеж, и не позволит создать 5 разных 9-патч-графики. Тем не менее, я просмотрел чертежи на основе списка слоев, чертежи вставки, обложки клипов - все они, кажется, требуют, чтобы вы знали размер представления заранее (например, чтобы сохранить его 2dp для вставки, вам нужно установить insetRight к ширине представления - 2dp). Я также пробовал использовать тег shape тег size, но он не сохраняет фиксированный размер, а только фиксированную пропорцию (поэтому для более высоких просмотров он будет масштабироваться пропорционально).

Я пропустил что-то простое, или это то, что я должен был бы прибегнуть к проверке программно после макета?

Ответ 1

Это невозможно. Это лучшее решение, которое я нашел. Только xml, без кодирования, без растровых изображений, без дополнительных просмотров)

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">

        <solid
            android:color="#ff0000" />
    </shape>
</item>
<item
    android:top="4dp">
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">

        <solid
            android:color="#00ff00" />
    </shape>
</item>

<item
    android:left="10dp">
    <shape
        android:shape="rectangle">
        <solid
            android:color="#FFFFFF" />
    </shape>
</item> 
</layer-list>

enter image description here

С помощью кода вы можете создать свой собственный тип ввода с желаемым поведением. Xml drawable очень ограниченный. IMHO мое предложение ближе всего к тому, что вы требовали.

Ответ 2

Я думаю, что ответ от @Leonidos очень близок к тому, что я предлагаю, за исключением того, что я использую drawable как отдельный вид вместо фона для всего макета подробного списка. Это позволяет установить фиксированную ширину и позволить тексту элемента иметь собственный фон. Дайте мне знать, если я не понимаю ваших ограничений.

Следующий файл: res/drawable/list_left_border

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <shape android:shape="rectangle" >
            <solid android:color="#e76e63" />
        </shape>
    </item>
    <item android:top="2dp">
        <shape android:shape="rectangle" >
            <solid android:color="#ffc257" />
        </shape>
    </item>

</layer-list>

Затем в макете для элемента списка в "res/layout/list_item.xml"

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

    <View
        android:background="@drawable/list_left_border"
        android:layout_width="8dp"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/listItemText"
        android:textSize="15sp"
        android:padding="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

Вот изображение. Фон розовый, чтобы показать, что элемент списка прозрачен.

enter image description here

Ответ 3

Я собираюсь пойти дальше и предложить небольшую переработку ответа AndroidGuy, который сам включает ответ Леонидоса.

Тот же доступный XML, другой элемент списка XML следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="100sp">

    <ImageView
        android:layout_width="8dp"
        android:layout_height="match_parent"
        android:src="@drawable/list_left_border" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:text="Item Text"
        android:textSize="22sp" >
    </TextView>
</FrameLayout>

FrameLayout дает исходное фоновое поведение, а не разделение на новое представление.

Я показал это ниже, с фонами, чтобы продемонстрировать:

illustration

Это действительно не заслуживает очков.