В этом уроке мы:
- рассмотрим логи приложения и всплывающие сообщения
Создадим проект:
Project name: P0121_LogAndMess
Build Target: Android 2.3.3
Application name: LogAndMess
Package name: ru.startandroid.develop.logandmess
Create Activity: MainActivity
Создадим в main.xml экран, знакомый нам по прошлым урокам про обработчики:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="horizontal"> <LinearLayout android:id="@+id/linearLayout1" android:layout_height="match_parent" android:orientation="vertical" android:layout_width="match_parent" android:layout_margin="30dp"> <TextView android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:id="@+id/tvOut" android:layout_gravity="center_horizontal" android:layout_marginBottom="50dp"> </TextView> <Button android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:id="@+id/btnOk" android:text="OK" android:layout_width="100dp"> </Button> <Button android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:id="@+id/btnCancel" android:text="Cancel" android:layout_width="100dp"> </Button> </LinearLayout> </LinearLayout>
Алгоритм приложения будет тот же. По нажатию кнопок меняется текст. Обработчик - Activity.
public class MainActivity extends Activity implements OnClickListener { TextView tvOut; Button btnOk; Button btnCancel; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // найдем View-элементы tvOut = (TextView) findViewById(R.id.tvOut); btnOk = (Button) findViewById(R.id.btnOk); btnCancel = (Button) findViewById(R.id.btnCancel); // присваиваем обработчик кнопкам btnOk.setOnClickListener(this); btnCancel.setOnClickListener(this); } @Override public void onClick(View v) { // по id определяем кнопку, вызвавшую этот обработчик switch (v.getId()) { case R.id.btnOk: // кнопка ОК tvOut.setText("Нажата кнопка ОК"); break; case R.id.btnCancel: // кнопка Cancel tvOut.setText("Нажата кнопка Cancel"); break; } } }
Сохраним, запустим. Убедимся, что все работает.
Логи приложения
Когда вы тестируете работу приложения, вы можете видеть логи работы. Они отображаются в окне LogCat. Чтобы отобразить окно откройте меню Window > Show View > Other … В появившемся окне выберите Android > LogCat
Должна появится вкладка LogCat
Рассмотрим эту вкладку подробней. Логи имеют разные уровни важности: ERROR, WARN, INFO, DEBUG, VERBOSE (по убыванию). Кнопки V D I W E (в кружках) – это фильтры и соответствуют типам логов. Опробуйте их и обратите внимание, что фильтр показывает логи не только своего уровня, но и уровней более высокой важности. Также вы можете создавать, редактировать и удалять свои фильтры – это мы рассмотрим чуть дальше.
Давайте смотреть, как самим писать логи. Делается это совсем несложно с помощью класса Log и его методов Log.v() Log.d() Log.i() Log.w() and Log.e(). Названия методов соответствуют уровню логов, которые они запишут.
Изменим код MainActivity.java. Возьмем все каменты из кода и добавим в DEBUG-логи с помощью метода Log.d. Метод требует на вход тэг и текст сообщения. Тэг – это что-то типа метки, чтобы легче было потом в куче системных логов найти именно наше сообщение. Добавим описание тега (TAG) и запишем все тексты каментов в лог.
public class MainActivity extends Activity implements OnClickListener { TextView tvOut; Button btnOk; Button btnCancel; private static final String TAG = "myLogs"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // найдем View-элементы Log.d(TAG, "найдем View-элементы"); tvOut = (TextView) findViewById(R.id.tvOut); btnOk = (Button) findViewById(R.id.btnOk); btnCancel = (Button) findViewById(R.id.btnCancel); // присваиваем обработчик кнопкам Log.d(TAG, "присваиваем обработчик кнопкам"); btnOk.setOnClickListener(this); btnCancel.setOnClickListener(this); } @Override public void onClick(View v) { // по id определяем кнопку, вызвавшую этот обработчик Log.d(TAG, "по id определяем кнопку, вызвавшую этот обработчик"); switch (v.getId()) { case R.id.btnOk: // кнопка ОК Log.d(TAG, "кнопка ОК"); tvOut.setText("Нажата кнопка ОК"); break; case R.id.btnCancel: // кнопка Cancel Log.d(TAG, "кнопка Cancel"); tvOut.setText("Нажата кнопка Cancel"); break; } } }
Eclipse ругнется, что не знает класс Log. Обновите импорт (CTRL+SHIFT+O) и, если спросит, выберите android.util.Log. Запустим приложение, понажимаем кнопки и посмотрим логи
Видно, что все отлично записалось. Чтобы сделать просмотр удобней, создадим свой фильтр. Жмем значок +
Имя фильтра произвольное, например, «My logs». Log Tag – это как раз значение константы TAG, которая описана в нашем коде и использовалась в методе Log.d, т.е. - "myLogs". Pid оставляем пустым, это id процесса. Уровень поставим Debug
и жмем OK. Появилась новая вкладка My logs, на которой отображаются логи, соответствующие только что созданному фильтру.
Мы помещали в лог текст, но разумеется, вы можете писать, например, значения интересующих вас переменных (приведенные к типу String).
Иногда бывает, что логи не отображаются во вкладке LogCat, хотя AVD запущен, приложение работает без проблем. В таком случае должно помочь следующее: в Eclipse идем в меню Window > Open Perspective > Other > DDMS. Откроется немного другой набор окон чем обычно. Там найдите вкладку Devices и в ней должно быть видно ваше AVD-устройство, кликните на него и логи должны появиться. Чтобы вернуться в разработку: Window > Open Perspective > Java.
Всплывающие сообщения
Приложение может показывать всплывающие сообщения с помощью класса Toast. Давайте подредактируем метод onClick. Сделаем так, чтобы всплывало сообщение о том, какая кнопка была нажата.
public void onClick(View v) { // по id определяем кнопку, вызвавшую этот обработчик Log.d(TAG, "по id определяем кнопку, вызвавшую этот обработчик"); switch (v.getId()) { case R.id.btnOk: // кнопка ОК Log.d(TAG, "кнопка ОК"); tvOut.setText("Нажата кнопка ОК"); Toast.makeText(this, "Нажата кнопка ОК", Toast.LENGTH_LONG).show(); break; case R.id.btnCancel: // кнопка Cancel Log.d(TAG, "кнопка Cancel"); tvOut.setText("Нажата кнопка Cancel"); Toast.makeText(this, "Нажата кнопка Cancel", Toast.LENGTH_LONG).show(); break; } }
Разберем синтаксис вызова. Статический метод makeText создает View-элемент Toast. Параметры метода:
- context – пока не будем вдаваться в подробности, что это такое и используем текущую Activity, т.е. this.
- text – текст, который надо показать
- duration – продолжительность показа (Toast.LENGTH_LONG - длинная, Toast.LENGTH_SHORT - короткая)
Toast создан и чтобы он отобразился на экране, вызывается метод show(). Сохраняем, запускаем, проверяем.
Если у вас есть Андроид-смартфон, я думаю вы уже видели подобные сообщения. Теперь вы знаете, как это делается )
На следующем уроке:
- создаем пункты меню
Присоединяйтесь к нам в Telegram:
- в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance
- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня