Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пери перевод.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
103.17 Кб
Скачать

Изменение существующих Представлений

Android содержит набор Представлений, которые способны удовлетворить

большинство потребностей пользовательского интерфейса. Изменяя их, вы

избегаете повторной реализации существующего поведения, адаптируя при

этом пользовательский интерфейс и функциональность под требования

своего приложения.

Чтобы разработать новое Представление, основанное на уже существу-

ющем элементе, создайте класс, который его наследует. Этот процесс по-

казан в листинге 4.5.

140 бет

Листинг 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) {

141 бет

[ ... Обработайте каким-то образом ... ]

[ ... нажатия конкретных клавиш ... ]

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

// в базовом классе, чтобы реагировать на нажатия клавиш

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.

142 бет

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 и добавьте в него значение, опи-

сывающее ширину кромки страницы.

143 бет

<?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);

}