Главная страница
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей

Программирование под Android. Для профессионалов


Скачать 19.35 Mb.
НазваниеПрограммирование под Android. Для профессионалов
АнкорBrayn_Khardi_Bill_Fillips_-_Programmirovanie_po.
Дата23.05.2017
Размер19.35 Mb.
Формат файлаpdf
Имя файлаBrayn_Khardi_Bill_Fillips_-_Programmirovanie_po.pdf
оригинальный pdf просмотр
ТипДокументы
#21061
страница37 из 55
КаталогОбразовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей
1   ...   33   34   35   36   37   38   39   40   ...   55
Глава 24. Стили и включения
Листинг 24.1 (продолжение)
setContentView(R.layout.activity_remote_control);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_remote_control, menu);
return true;
}
@Override
protected Fragment createFragment() {
return new RemoteControlFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
}
}
Откройте файл
AndroidManifest.xml и ограничьте эту активность портретной ориен- тацией.
Листинг 24.2. Ограничьтесь портретной ориентацией (AndroidManifest.xml)
android:label="@string/app_name"
android:screenOrientation="portrait">





Создание RemoteControlFragment
На панели
Package
Explorer переименуйте файл activity_remote_control.xml в fragment_re- mote_control.xml
. Для начала мы создадим трехкнопочный пульт, чтобы упростить код.
Замените содержимое fragment_remote_control.xml разметкой XML из листинга 24.3.
Листинг 24.3. Исходный трехкнопочный макет (layout/fragment_remote_control.xml)

xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RemoteControlActivity" >

android:layout_width="wrap_content"
android:layout_height="wrap_content"

Создание проекта RemoteControl
397
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/hello_world" />


android:id="@+id/fragment_remote_control_tableLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="*" >

android:id="@+id/fragment_remote_control_selectedTextView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="center"
android:text="0"
android:textSize="50dp" />

android:id="@+id/fragment_remote_control_workingTextView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_margin="15dp"
android:background="#555555"
android:gravity="center"
android:text="0"
android:textColor="#cccccc"
android:textSize="20dp" />


android:id="@+id/fragment_remote_control_zeroButton"
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="0" />

android:id="@+id/fragment_remote_control_oneButton"
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="1" />

android:id="@+id/fragment_remote_control_enterButton"
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="Enter" />


Конструкция android:stretchColumns="*"
гарантирует, что все столбцы будут иметь одинаковую ширину. Кроме того, для определения размера текста мы используем единицы dp вместо sp
. Это означает, что текст будет иметь одинаковый размер не- зависимо от настроек пользователя.
Наконец, создайте новый класс с именем
RemoteControlFragment
. Назначьте его суперклассом android.support.v4.app.Fragment
. В файле
RemoteControlFragment.
java переопределите метод onCreateView(…)
с назначением слушателей для кнопок.

398
Глава 24. Стили и включения
Листинг 24.4. Создание класса RemoteControlFragment (RemoteControlFragment.java)
public class RemoteControlFragment extends Fragment {
private TextView mSelectedTextView;
private TextView mWorkingTextView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_remote_control, parent, false);
mSelectedTextView = (TextView)v
.findViewById(R.id.fragment_remote_control_selectedTextView);
mWorkingTextView = (TextView)v
.findViewById(R.id.fragment_remote_control_workingTextView);
View.OnClickListener numberButtonListener = new View.OnClickListener() {
public void onClick(View v) {
TextView textView = (TextView)v;
String working = mWorkingTextView.getText().toString();
String text = textView.getText().toString();
if (working.equals("0")) {
mWorkingTextView.setText(text);
} else {
mWorkingTextView.setText(working + text);
}
}
};
Button zeroButton = (Button)v
.findViewById(R.id.fragment_remote_control_zeroButton);
zeroButton.setOnClickListener(numberButtonListener);
Button oneButton = (Button)v
.findViewById(R.id.fragment_remote_control_oneButton);
oneButton.setOnClickListener(numberButtonListener);
Button enterButton = (Button) v
.findViewById(R.id.fragment_remote_control_enterButton);
enterButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CharSequence working = mWorkingTextView.getText();
if (working.length() > 0)
mSelectedTextView.setText(working);
mWorkingTextView.setText("0");
}
});
return v;
}
}
Хотя мы используем три кнопки, нужны только два слушателя щелчков. Дело в том, что для обоих цифровых кнопок может использоваться один слушатель.
При щелчке на цифровой кнопке вы либо добавляете новую цифру в существую- щем текстовом представлении, либо заменяете его цифрой, на которой был сделан

Стили и компактность разметки
399
щелчок — в зависимости от того, является ли текущим введенным текстом 0. Затем при нажатии кнопки
Enter текст рабочей области перемещается в область выбора и стирается.
Запустите приложение RemoteControl. Вы увидите простое трехкнопочное прило- жение с двоичным вводом. Да если разобраться, кому нужно больше двух кнопок?
Рис. 24.3. Пульт с двоичным вводом
Стили и компактность разметки
Теперь, когда у нас имеется работоспособный проект, взгляните на разметку макета.
Все кнопки выглядят одинаково. Пока это не создает проблем, но если вы захотите добавить к кнопке атрибут, работу придется повторить в трех местах. А что будет, когда кнопок станет двенадцать?
К счастью, Android поддерживает стили пользовательского интерфейса, которые позволяют избавиться от подобных повторений. Ресурсы стилей похожи на стили
CSS. Каждый стиль определяет набор пар XML «атрибут-значение». Стили орга- низуются в иерархию: потомок обладает теми же атрибутами и значениями, что и родитель, но может переопределять их или добавлять новые значения.
Стили, как и строковые ресурсы, определяются в теге

файла XML из папки res/values
. Имя файла, как и для строковых ресурсов, несущественно, но по общепринятой схеме стили размещаются в файле styles.xml

400
Глава 24. Стили и включения
Мастер проектов Android уже создал за вас файл styles.xml
. (Обратите внимание: в этом файле уже определена тема приложения RemoteControl — стандартная для
Android; тема определяет внешний вид кнопок, фоны и другие распространенные элементы.)
Мы переместим атрибуты, общие для всех кнопок, из конкретных кнопок в новый стиль
RemoteButton
. Включите в файл стилей определение, приведенное ниже.
Листинг 24.5. Исходные определения стилей RemoteControl (values/styles.xml)



Каждый стиль определяется элементом

Взмах волшебной палочки — и все кнопки моментально изменяются!
Рис. 24.5. Все кнопки выглядят одинаково!
Для любознательных: include и merge
Ранее в этой главе мы использовали тег include для многократного включения стро- ки кнопок
RemoteButton
(в один макет). Принцип работы тега достаточно очевиден:

Этот элемент включает содержимое файла разметки с идентификатором ресурса
@layout/some_partial_layout
Тег include может использоваться как для устранения дублирования разметки в одном макете, как это было сделано ранее в этой главе, так и для устранения дуб- лирования между макетами. Если некоторый блок разметки встречается в двух

Упражнение. Наследование стилей
405
и более макетах, вы можете создать его в форме макета и включать там, где он ну- жен. Если в будущем этот блок потребуется изменить, все изменения достаточно внести в одном месте.
У тегов include есть пара особенностей, о которых необходимо знать. Во-первых, включаемый макет проходит обычный процесс поиска ресурсов в зависимости от текущей конфигурации устройства; соответственно в нем можно использовать конфигурационные квалификаторы, как и в любом другом макете. Во-вторых, можно переопределять атрибут android:id и любые атрибуты android:layout_*
корневого элемента включаемого макета, указывая их в самом теге include
. Это позволяет использовать один макет несколько раз, указывая разные атрибуты при каждом включении.
Элемент merge работает в сочетании с элементом include
. Он может использоваться как корневой элемент включаемого макета вместо реального виджета. Когда один макет включает другой макет с корневым элементом merge
, потомки элемента merge включаются напрямую — они становятся потомками элемента include
, а элемент merge удаляется.
Механизм включения работает проще, чем кажется из описания. Если оно вам кажется запутанным, просто запомните, что элемент merge отбрасывается. Он присутствует только по одной причине: XML требует, чтобы корневой элемент присутствовал только в одном экземпляре.
Упражнение. Наследование стилей
Кнопки
Delete и
Enter скромно располагаются у нижнего края экрана, а в их оформ- лении используется такой же стиль, как у цифровых кнопок. Кнопкам «действий» нужен другой, более броский стиль.
Создайте новый стиль кнопки, производный от стиля
RemoteButton
, который уста- навливает атрибут полужирного текста. Затем включите использование нового стиля для первой и третьей кнопки в нижней строке.
Создать стиль, производный от другого стиля, несложно. Это можно сделать двумя способами. Первый — присвоить атрибуту parent вашего стиля имя того стиля, от которого он должен наследовать. Другой, более простой способ — снабдить имя стиля префиксом из родительского стиля и точки (например,
ParentStyleName.
MyStyleName
).

Графические объекты
В предыдущей главе мы быстро построили интерфейс пульта дистанционного управления, используя некоторые нетривиальные приемы создания макетов. Пульт выглядит неплохо, хотя и немного банально, потому что все кнопки в нем имеют ти- пичный для Android внешний вид и поведение. В этой главе мы воспользуемся двумя новыми инструментами, чтобы придать кнопкам совершенно особое оформление.
Рис. 25.1. Переработанная версия RemoteControl
Оба эти инструмента относятся к категории графических объектов (drawables). В An- droid графическим объектом называется все, что предназначено для прорисовки на
25

Графические объекты XML
407
экране, будь то абстрактная фигура, класс, производный от
Drawable
, или растровое изображение. Нам уже знаком один вид графических объектов:
BitmapDrawable
, представляющий растровое изображение.
В этой главе мы рассмотрим несколько других видов графических объектов: списки состояний, геометрические фигуры, списки слоев и 9-зонные графические объекты.
Поскольку первые три вида обычно определяются в файлах XML, мы объединим их в более широкую категорию графических объектов XML.
Графические объекты XML
Прежде чем браться за графические объекты XML, проведем небольшой экспери- мент: используем атрибут android:background для изменения цвета фона кнопок.
Листинг 25.1. Попытка изменения цвета кнопки (values/styles.xml)

Результат должен выглядеть примерно так.
Рис. 25.2. Что произошло?

408
1   ...   33   34   35   36   37   38   39   40   ...   55

перейти в каталог файлов
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей
Образовательный портал Как узнать результаты егэ Стихи про летний лагерь 3агадки для детей