Рис. 17.1
Начальный экран
Код выглядит довольно простым, правда? Но нам нужно добавить еще кое-
что, чтобы получить требуемое нам поведение.
Итак, мы знаем, что нам понадобится выполнить некоторые операции
с флажком и с кнопкой, поэтому получим ссылки на них с помощью метода
findViewById
, которым обладают экземпляры
Ac ti vi ty
и
View
. Также добавим пе
-
ременные-члены для хранения этих ссылок. Вот как теперь должен выглядеть
код в
Ac ti vi ty
:
262
Вывод списка с данными
Java
public class MainAc ti vi ty extends Ac ti vi ty {
private CheckBox mTermsCheckbox;
private Button mBrowseButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTermsCheckbox = findViewById(R.id.terms_checkbox);
mBrowseButton = findViewById(R.id.browse_button);
}
}
А теперь самое интересное: предыдущая версия кода на Kotlin уже реализует
все, что нам необходимо! Экземпляр
TextView
в ней доступен как
term_checkbox
,
а экземпляр
Button
– как
browse_button
, и для этого не пришлось добавлять ни
строчки кода. Экземпляры
Ac ti vi ty
в Kotlin, а также любых классов, реализу
-
ющих
LayoutContainer
, будут автоматически сохранять ссылки на любые пред
-
ставления, описанные в макете, в переменные-члены с именами, соответству
-
ющими идентификаторам этих представлений. Убедитесь сами:
Kotlin
class MainAc ti vi ty : Ac ti vi ty() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Отлично! Теперь у нас есть пользовательский интерфейс и ссылки в памя
-
ти на элементы пользовательского интерфейса, которые нам понадобятся.
Вспомним, чего мы хотим добиться:
1) кнопка
browse_button
должна запускать новый экземпляр
Ac
ti vi ty
, чтобы
дать пользователю возможность исследовать содержимое библиотеки;
2) кнопка
browse_button
должна оставаться неактивной, пока пользователь
не установит флажок
CheckBox
с надписью Accept Terms.
Чтобы реализовать первый пункт, нужно определить обработчик
View.On
ClickListener
для кнопки
Button
. Сделать это можно несколькими способами,
как описывалось в главе 4, посвященной пользовательскому вводу, но мы ис
-
пользуем ссылки на методы, чтобы сделать код более простым и понятным.
Наша реализация
View.OnClickListener
должна возвращать
void
и принимать
единственный параметр типа
View
.
Взгляните:
Java
public class MainAc ti vi ty extends Ac ti vi ty {
private CheckBox mTermsCheckbox;
Оформление представлений
263
private Button mBrowseButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTermsCheckbox = findViewById(R.id.terms_checkbox);
mBrowseButton = findViewById(R.id.browse_button);
mBrowseButton.setOnClickListener(this::browseContent);
}
private void browseContent(View view) {
Intent intent = new Intent(this, BrowseContentAc ti vi ty.class);
startAc ti vi ty(intent);
}
}
Kotlin
class MainAc ti vi ty : Ac ti vi ty() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
browse_button.setOnClickListener(::browseContent)
}
private fun browseContent(view: View) {
val intent = Intent(this, BrowseContentAc ti vi ty::class.java)
startAc
ti
vi
ty(intent)
}
}
Здесь мы назначили метод
browseContent
обработчиком события щелчка на
кнопке. Если теперь попробовать собрать приложение, редактор связей lint сооб
-
щит об отсутствии
BrowseContentAc ti vi ty
. Давайте исправим эту ошибку. Для этого
создайте минимальный файл с определением подкласса
Ac ti vi ty
, например:
Java
public class BrowseContentAc ti vi ty extends Ac ti vi ty {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
Kotlin
class BrowseContentAc ti vi ty : Ac ti vi ty() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
264
Вывод списка с данными
И не забудьте добавить его в манифест приложения!
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/DlmlTheme">
Далее нам нужно гарантировать неактивность кнопки, пока пользователь
не установит флажок Accept Terms. Для начала добавим атрибут
enabled="false"
в макете XML, а затем будем изменять его в коде при изменении состояния
CheckBox
. Для этого нам понадобится обработчик
OnCheckChangedListener
– опре
-
делим его, снова используя ссылку на метод. Согласно контракту
OnCheck
ChangedListener
, метод-обработчик должен возвращать
void
и принимать два
параметра: экземпляр
Button
, который может быть виджетом
CheckBox
,
Switch
или аналогичным элементом пользовательского интерфейса, а также логиче
-
ское значение, определяющее состояние флажка. Метод
onCheckChanged
, пред
-
ставленный ниже, соответствует этим критериям; свяжем его с флажком
Check
Box
, ссылку на который мы получили выше:
Java
public class MainAc ti vi ty extends Ac ti vi ty {
private CheckBox mTermsCheckbox;
private Button mBrowseButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTermsCheckbox = findViewById(R.id.terms_checkbox);
mTermsCheckbox.setOnCheckedChangeListener(this::onCheckChanged);
mBrowseButton = findViewById(R.id.browse_button);
mBrowseButton.setOnClickListener(this::browseContent);
}
private void onCheckChanged(Button button, boolean checked) {
Оформление представлений
265
mBrowseButton.setEnabled(checked);
}
private void browseContent(View view) {
Intent intent = new Intent(this, BrowseContentAc ti vi ty.class);
startAc ti vi ty(intent);
}
}
Kotlin
class MainAc ti vi ty : Ac ti vi ty() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(com.oreilly.R.layout.activity_main)
browse_button.setOnClickListener(::browseContent)
terms_checkbox.setOnCheckedChangeListener(::onCheckChanged)
}
private fun browseContent(view: View) {
val intent = Intent(this, BrowseContentAc ti vi ty::class.java)
startAc
ti
vi
ty(intent)
}
private fun onCheckChanged(button: Button, checked: Boolean) {
browse_button.isEnabled = checked
}
}
Если теперь снова собрать и запустить приложение, можно заметить, что
кнопка приобрела неактивный вид и не реагирует на касания. Но если кос
-
нуться флажка (или прикрепленной к нему метки), чтобы установить его,
кнопка изменит свой внешний вид и будет выглядеть активной, готовой среа-
гировать на касание. Если теперь коснуться кнопки, откроется новый экран
BrowseContentAc ti vi ty
. И пусть этот экран пока пустой, но уже само его появле
-
ние наглядно показывает, что основу навигации в Android составляют взаимо
-
действия с пользователем и экземпляры
Ac ti vi ty
.
Теперь оставим в покое Android и посмотрим, как то же самое сделать в iOS.
iOS
Чтобы упростить себе работу с приложением в будущем, первым делом нам
следует настроить его структуру и оформление. Начнем со структуры.
Do'stlaringiz bilan baham: |