Можно ли создать фиксированную ширину в 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]()
Это действительно не заслуживает очков.