Главная » Разработка для Android » Создание составных элементов управления

0

Составные  элементы  управления — это полноценные,  пригодные  для многократного использования Представления, которые содержат несколько дочерних компонентов,  скомпонованных и связанных друг с другом.

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

содержит.  Такие  элементы  получаются в результате  наследования клас- са ViewGroup (или  его производных,  например  разметки). Чтобы создать новый составной элемент управления, выберите класс разметки,  который больше всего подходит для позиционирования дочерних компонентов, и на- следуйте его, как показано в листинге 4.6.

Листинг 4.6. Создание составного элемента управления

public class MyCompoundView extends LinearLayout {

public MyCompoundView(Context context) {

super(context);

}

public MyCompoundView(Context context, AttributeSet attrs) {

super(context, attrs);

}

}

Как и в случае с Активностями, при проектировании разметки  для со- ставных Представлений лучше всего использовать внешний ресурс. В листин- ге 4.7 показан  пример  описания  разметки  в формате  XML для элемента, содержащего два Представления: поле ввода EditText и кнопку Button, которая это поле очищает.

Листинг 4.7. Ресурс с разметкой для составного Представления

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"

android:layout_width="fill_parent" android:layout_height="fill_parent">

<EditText android:id="@+id/editText" android:layout_width="fill_parent" android:layout_height="wrap_content"

/>

<Button android:id="@+id/clearButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Clear"

/>

</LinearLayout>

Чтобы применить эту разметку, переопределите конструктор нового Представления, добавив в него вызов метода inflate, который принадлежит системному Сервису LayoutInflate. Данный метод принимает в качестве па- раметра ресурс с разметкой  и возвращает  «наполненное» Представление.

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

В листинге  4.8 представлен  класс ClearableEditText, в конструкторе которого  происходит  наполнение  ресурса с разметкой,  созданного  ранее, и получение ссылок на каждое Представление, которое он содержит. При этом вызывается метод hookupButton, используемый для подключения функции

«очистки текста», срабатывающей при нажатии кнопки.

Листинг 4.8. Создание составного Представления

public class ClearableEditText extends LinearLayout {

EditText editText; Button clearButton;

public ClearableEditText(Context context) {

super(context);

// Наполните Представление из ресурса с разметкой. String infService = Context.LAYOUT_INFLATER_SERVICE; LayoutInflater li;

li = (LayoutInflater)getContext().getSystemService(infService);

li.inflate(R.layout.clearable_edit_text, this, true);

// Получите ссылки на дочерние элементы.

editText = (EditText)findViewById(R.id.editText);

clearButton = (Button)findViewById(R.id.clearButton);

// Подключите функциональность hookupButton();

}

}

Если вы предпочитаете создавать разметку  в коде программы, можете сделать это таким же образом, как и в случае с Активностью. В листинге 4.9 показан переопределенный конструктор ClearableEditText, в котором соз- дается пользовательский интерфейс,  аналогичный тому, что был описан в формате XML в предыдущем листинге.

Листинг 4.9. Создание разметки  для составного Представления в коде программы

public ClearableEditText(Context context) {

super(context);

// Сделайте разметку вертикальной setOrientation(LinearLayout.VERTICAL);

// Создайте дочерние элементы управления. editText = new EditText(getContext()); clearButton = new Button(getContext()); clearButton.setText("Clear");

// Расположите их внутри составного элемента. int lHeight = LayoutParams.WRAP_CONTENT;

int lWidth = LayoutParams.FILL_PARENT;

addView(editText, new LinearLayout.LayoutParams(lWidth, lHeight));

addView(clearButton, new LinearLayout.LayoutParams(lWidth, lHeight));

// Подключите функциональность hookupButton();

}

Создав разметку для Представления, можно подключить обработчики событий для каждого дочернего элемента, чтобы обеспечить нужную функ- циональность. В представленном ниже фрагменте наполняется кодом метод hookupButton — он отвечает за очистку  текста в элементе  EditText при нажатии кнопки:

private void hookupButton() {

clearButton.setOnClickListener(new Button.OnClickListener() {

public void onClick(View v) {

editText.setText("");

}

});

}

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии