Пользовательский вид из нескольких видов

У меня есть набор представлений, которые я хочу всегда использовать вместе. Примером этого может быть что-то вроде:

<LinearLayout>
    <TextView />
    <EditView />
</LinearLayout>

Текстовое представление - это приглашение, и представление редактирования является ответом. Я хотел бы дать этой комбинации имя и использовать это имя, чтобы поместить его в xml. Я бы хотел, чтобы это было настраиваемое представление, поэтому я могу хорошо поместить его в класс и создать для него различные служебные функции. Есть ли способ сделать это? Я знаю, что могу подклассировать LinearLayout и динамически создавать дети в Java-коде, но это лишает меня возможности легко вносить изменения через xml. Есть ли лучший маршрут?

И да, у меня также есть места, которые я хочу сделать, которые более активны, чем просто подсказки.

Ответы

Ответ 1

Этот пример предназначен для горизонтального виджета для выбора числа, но это та же концепция.

Сначала создайте XML-макет для своего настраиваемого компонента

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

   <Button
       android:id="@+id/btn_minus"
       android:layout_width="50dp"
       android:layout_height="wrap_content"
       android:text="-" />

   <EditText
       android:id="@+id/edit_text"
       android:layout_width="75dp"
       android:layout_height="wrap_content"
       android:inputType="number"
       android:gravity="center"
       android:focusable="false"
       android:text="0" />

   <Button
       android:id="@+id/btn_plus"
       android:layout_width="50dp"
       android:layout_height="wrap_content"
       android:text="+" />
</LinearLayout>

Затем создайте класс java

public class HorizontalNumberPicker extends LinearLayout {
    public HorizontalNumberPicker(Context context, AttributeSet attrs) {
         super(context, attrs);
         LayoutInflater inflater = LayoutInflater.from(context);
         inflater.inflate(R.layout.horizontal_number_picker, this);
     }
 }

Добавьте любую логику в этот класс java, тогда вы можете просто добавить настраиваемый компонент в свой XML-макет, например:

<com.example.HorizontalNumberPicker
     android:id ="@+id/horizontal_number_picker"
     android:layout_width ="wrap_content"
     android:layout_height ="wrap_content" />


Посмотрите эту ссылку для получения дополнительной информации: http://developer.android.com/guide/topics/ui/custom-components.html#compound

Ответ 3

Поместите этот XML в XML файл макета и раздуйте представление с помощью надувного устройства, когда захотите.

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.some_id, parent, false);

Как только у вас появится представление, вы можете написать класс утилиты, который принимает это представление и выполняет операции над ним. Извлеките текст и отредактируйте представление с помощью findViewById() или сохраните ссылки на эти другие виды, используя шаблон ViewHolder

Ответ 4

Вы должны использовать Java Layoutinflater. Это достаточный способ решить вашу проблему. Это код:

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.some_id, parent, false);

Это создает layoutinflater, а затем показывает его как rowView. Также я задал вопрос здесь. Вы оставили комментарий, а я ответил другим. Я просмотрел ваш профиль, и вы, кажется, знаете много Android и Java. Возможно ли вам разобраться в моей проблеме?