Я пытаюсь создать настраиваемый вид, который заменит определенный макет, который я использую в нескольких местах, но я изо всех сил пытаюсь это сделать.
В принципе, я хочу заменить это:
<RelativeLayout
android:id="@+id/dolphinLine"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/background_box_light_blue"
android:padding="10dip"
android:layout_margin="10dip">
<TextView
android:id="@+id/dolphinTitle"
android:layout_width="200dip"
android:layout_height="100dip"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dip"
android:text="@string/my_title"
android:textSize="30dip"
android:textStyle="bold"
android:textColor="#2E4C71"
android:gravity="center"/>
<Button
android:id="@+id/dolphinMinusButton"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_toRightOf="@+id/dolphinTitle"
android:layout_marginLeft="30dip"
android:text="@string/minus_button"
android:textSize="70dip"
android:textStyle="bold"
android:gravity="center"
android:layout_marginTop="1dip"
android:background="@drawable/button_blue_square_selector"
android:textColor="#FFFFFF"
android:onClick="onClick"/>
<TextView
android:id="@+id/dolphinValue"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_marginLeft="15dip"
android:background="@android:drawable/editbox_background"
android:layout_toRightOf="@+id/dolphinMinusButton"
android:text="0"
android:textColor="#2E4C71"
android:textSize="50dip"
android:gravity="center"
android:textStyle="bold"
android:inputType="none"/>
<Button
android:id="@+id/dolphinPlusButton"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_toRightOf="@+id/dolphinValue"
android:layout_marginLeft="15dip"
android:text="@string/plus_button"
android:textSize="70dip"
android:textStyle="bold"
android:gravity="center"
android:layout_marginTop="1dip"
android:background="@drawable/button_blue_square_selector"
android:textColor="#FFFFFF"
android:onClick="onClick"/>
</RelativeLayout>
Этим:
<view class="com.example.MyQuantityBox"
android:id="@+id/dolphinBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:myCustomAttribute="@string/my_title"/>
Итак, мне не нужен настраиваемый макет, я хочу настраиваемый вид (у этого представления не должно быть дочерних элементов).
Единственное, что может измениться от одного экземпляра MyQuantityBox к другому, - это заголовок. Я бы очень хотел иметь возможность указать это в XML (как я это делаю в последней строке XML)
Как я могу это сделать? Должен ли я поместить RelativeLayout в XML-файл в / res / layout и раздуть его в моем классе MyBoxQuantity? Если да, как мне это сделать?
Спасибо!
Ответы:
Да, ты можешь это сделать. RelativeLayout, LinearLayout и т. Д. Являются представлениями, поэтому настраиваемый макет является настраиваемым представлением. Просто подумайте, потому что, если вы хотите создать собственный макет, вы можете это сделать.
Что вы хотите сделать, так это создать составной элемент управления. Вы создадите подкласс RelativeLayout, добавите все наши компоненты в код (TextView и т. Д.), А в своем конструкторе вы сможете читать атрибуты, переданные из XML. Затем вы можете передать этот атрибут в свой заголовок TextView.
http://developer.android.com/guide/topics/ui/custom-components.html
источник
Немного устарел, но я подумал поделиться тем, как я это сделаю, основываясь на ответе chubbsondubs: Я использую
FrameLayout
(см. Документацию ), поскольку он используется для хранения одного представления и раздувает в нем представление из xml.Код следующий:
источник
this
третий параметр)Вот простая демонстрация для создания customview (составного представления) путем надувания из xml
attrs.xml
CustomView.kt
custom_layout.xml
Мы должны использовать
merge
здесь, а неConstraintLayout
потому, чтоЕсли мы используем
ConstraintLayout
здесь, иерархия макета будетConstraintLayout
->ConstraintLayout
->ImageView
+TextView
=> у нас есть 1 избыточныйConstraintLayout
=> не очень хорошо для производительностиИспользование activity_main.xml
Результат
Демо Github
источник
Используйте LayoutInflater, как показано ниже.
источник
На практике я обнаружил, что вам нужно быть немного осторожным, особенно если вы постоянно используете немного xml. Предположим, например, что у вас есть таблица, в которой вы хотите создать строку таблицы для каждой записи в списке. Вы настроили некоторый xml:
В
my_table_row.xml
:Затем вы хотите создать его один раз для каждой строки с некоторым кодом. Предполагается, что вы определили родительский TableLayout myTable для присоединения строк.
Для ясного простого примера обработки rowButton.setOnClickListener (this) см. Onclicklistener для программно созданной кнопки .
источник