Главная » Разработка для Android » Изменение существующих Представлений

0

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

Чтобы разработать новое Представление, основанное  на уже существу- ющем элементе, создайте класс, который  его наследует. Этот процесс по- казан в листинге 4.5.

Листинг 4.5. Расширение элемента TextView

import android.content.Context; import android.util.AttributeSet; import android.widget.TextView;

public class MyTextView extends TextView {

public MyTextView (Context context, AttributeSet attrs, int defStyle)

{

super(context, attrs, defStyle);

}

public MyTextView (Context context) {

super(context);

}

public MyTextView (Context context, AttributeSet attrs) {

super(context, attrs);

}

}

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

В следующем дополнении к листингу 4.5 переопределяется метод onDraw, чтобы изменить  внешний  вид элемента,  а также обработчик  onKeyDown, чтобы добавить реакцию на нестандартные нажатия  клавиш:

public class MyTextView extends TextView {

public MyTextView (Context context, AttributeSet ats, int defStyle) {

super(context, ats, defStyle);

}

public MyTextView (Context context) {

super(context);

}

public MyTextView (Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

public void onDraw(Canvas canvas) {

[ … Нарисуйте что-либо на Холсте под текстом … ]

// Render the text as usual using the TextView base class. super.onDraw(canvas);

[ … Нарисуйте что-либо на Холсте над текстом … ]

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {

[ … Обработайте каким-то образом … ] [ … нажатия конкретных клавиш … ]

// Используйте уже имеющуюся функциональность, реализованную

// в базовом классе, чтобы реагировать на нажатия клавиш return super.onKeyDown(keyCode, keyEvent);

}

}

Обработчики событий, доступные внутри Представлений, более подробно будут рассмотрены  ниже в этой главе.

Изменение приложения To-Do List. Приложение To-Do List из главы 2 использует  элементы  TextView  для отображения каждой  строки  в спи- ске ListView. Вы можете изменить  внешний  вид списка, наследовав  класс TextView  и переопределив метод onDraw.

В этом примере1  вы создадите  новое Представление TodoListItemView, которое будет выводить элементы списка так, как будто они записаны в бу- мажном блокноте. По завершении измененная программа To-Do List должна выглядеть, как на рис. 4.1.

Рис. 4.1.

1     Все фрагменты  кода в этом примере  — часть проекта Todo List из главы 4, их можно за- грузить с сайта Wrox.com.

1. Создайте новый класс TodoListItemView, который наследует TextView.

Добавьте заглушку для переопределения метода onDraw, реализуйте конструктор,  в котором вызывается новый метод-заглушка init.

package com.paad.todolist;

import android.content.Context;

import android.content.res.Resources;

import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.widget.TextView;

public class TodoListItemView extends TextView {

public TodoListItemView (Context context, AttributeSet ats, int ds) {

super(context, ats, ds);

init();

}

public TodoListItemView (Context context) {

super(context);

init();

}

public TodoListItemView (Context context, AttributeSet attrs) {

super(context, attrs);

init();

}

private void init() {

}

@Override

public void onDraw(Canvas canvas) {

// Используйте родительский класс TextView для вывода текста. super.onDraw(canvas);

}

}

2. Создайте  новый ресурс colors.xml в каталоге  res/values. Добавьте значения,  описывающие цвета бумаги, кромки  страницы,  линии и текста.

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

<resources>

<color name="notepad_paper">#AAFFFF99</color>

<color name="notepad_lines">#FF0000FF</color>

<color name="notepad_margin">#90FF0000</color>

<color name="notepad_text">#AA0000FF</color>

</resources>

3. Создайте новый файл dimens.xml и добавьте в него значение, опи- сывающее ширину кромки страницы.

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

<resources>

<dimen name="notepad_margin">30dp</dimen>

</resources>

4. Закончив описание  ресурсов, можно начинать  изменять  внешний вид TodoListItemView. Создайте  новые приватные  поля для хране- ния объектов Paint,  которые вы будете использовать при рисовании фона и кромки бумажного листа. Также создайте поля для цвета листа и ширины кромки.

Наполните кодом метод init, добавив в него создание объектов Paint и получение  экземпляров тех ресурсов, которые вы создали  в двух предыдущих  шагах.

private Paint marginPaint; private Paint linePaint; private int paperColor; private float margin;

private void init() {

// Получите ссылку на таблицу ресурсов. Resources myResources = getResources();

// Создайте кисти для рисования, которые мы будем использовать в методе onDraw.

marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG); marginPaint.setColor(myResources.getColor(R.color.notepad_margin)); linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

linePaint.setColor(myResources.getColor(R.color.notepad_lines));

// Получите цвет фона для листа и ширину кромки. paperColor = myResources.getColor(R.color.notepad_paper); margin = myResources.getDimension(R.dimen.notepad_margin);

}

5. Чтобы  отобразить  лист, переопределите метод onDraw  и нарисуйте изображение,  используя объекты Paint из пункта 4. Вызовите  метод onDraw  из родительского класса и позвольте  ему нарисовать  текст, как он это обычно делает.

@Override

public void onDraw(Canvas canvas) {

// Фоновый цвет для листа canvas.drawColor(paperColor);

// Нарисуйте направляющие линии

canvas.drawLine(0, 0, getMeasuredHeight(), 0, linePaint);

canvas.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), linePaint);

// Нарисуйте кромку

canvas.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint);

// Переместите текст в сторону от кромки canvas.save();

canvas.translate(margin, 0);

// Используйте TextView для вывода текста. super.onDraw(canvas);

canvas.restore();

}

6. На этом реализация TodoListItemView завершена.  Чтобы использо- вать ее внутри  Активности ToDoList, необходимо  добавить  соответ- ствующий элемент в новую разметку, после чего передать эту разметку в конструктор объекта ArrayAdapter.

Начните с создания нового ресурса todolist_item.xml в каталоге res/layout. В нем указано, каким образом должен отображаться каждый элемент списка. В данном примере разметка должна состоять из един- ственного элемента  TodoListItemView, заполняющего все доступное пространство.

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

<com.paad.todolist.TodoListItemView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"

android:padding="10dp" android:scrollbars="vertical" android:textColor="@color/notepad_text" android:fadingEdge="vertical"

/>

7. Теперь  откройте  класс Активности ToDoList.  В завершение  необхо- димо изменить  параметры,  передаваемые  в ArrayAdapter внутри ме- тода onCreate. Вместо ссылки, указывающей  на стандартный ресурс android.R.layout.simple_list_item_1, вставьте ссылку на новую разметку R.layout.todolist_item, созданную вами на шаге 6.

final ArrayList<String> todoItems = new ArrayList<String>();

int resID = R.layout.todolist_item;

final ArrayAdapter<String> aa = new ArrayAdapter<String>(this, resID, todoItems);

myListView.setAdapter(aa);

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

По теме:

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