Щелчок кнопки/Счетчик ворон

Не тяни кота за хвост

На прошлом занятии я уже упомянул о возможности визуального построения интерфейса программы. Сегодня мы попробуем поместить на форму кнопку визуальным способом, а также написать код, который будет выполняться при щелчке на кнопке.

Можете открыть старый проект или создать новый проект с стандартными настройками.

Откройте файл main.xml. Обратите внимание, что в нижней части окна среды разработки имеются две вкладки: Graphical Layout и main.xml. Откройте вкладку Graphical Layout и внимательно изучите окно. Слева у вас будет панель Palette, содержащая большой список элементов Views и Layouts. Сейчас нас интересуют только элементы Views, которые являются элементами управления - кнопки, флажки, переключатели, индикаторы прогресса и т.д.

Подведите курсор к элементу Button и перетащите его на форму. В результате ваших действий на форме появится стандартная кнопка с настройками по умолчанию. В правой части экрана у вас имеется окно Properties, в котором вы можете настроить необходимые свойства для кнопки. Например, отыщите свойство Text и присвойте ему свой текст - Поздороваться. По своей старой привычке я также присвоил свойству id новое значение @+id/butHello вместо стандартного @+id/button1.

Заодно добавим на форму текстовое поле, куда будем выводить приветствие после щелчка кнопки. Выбираем на панели инструментов элемент EditText и перетаскиваем его на форму. В окне свойств удаляем текст из свойства Text, чтобы в текстовом поле ничего не было.

Кстати, если вам не нравится взаимное расположение помещенных элементов, то можете на форме перетаскивать кнопку и текстовое поле, меняя их местами. Обратите внимание, что элементы при этом располагаются строго друг над другом. У вас не получится расположить их рядом на одной линии. Забегая вперед, скажу, что такое поведение связано с контейнером LinearLayout, внутри которого расположены наши элементы. LinearLayout предназначен специально для тех случаев, когда необходимо упорядочить элементы строго в столбик. При этом разработчику не приходится заниматься вычислениями координат для каждого элемента - система самостоятельно расчитает расположение элементов.

Будем считать, что интерфейс программы готов - у нас есть кнопка для нажатия и текстовое поле для вывода сообщений.

Теперь нужно научиться писать код для щелчка кнопки. Переключитесь с вкладки Graphical Layout на вкладку main.xml и найдите тег <Button>. Добавьте к нему еще одну строчку:


<Button android:layout_height="wrap_content" 
    android:id="@+id/butHello" 
    android:layout_width="wrap_content" 
    android:text="Поздороваться" 
    android:onClick="butHello_Click"></Button>

Таким образом мы определили событие onClick для кнопки (щелчок) и теперь нам осталось написать обработчик события. Открываем файл HelloWorld.java и пишем сразу после метода onCreate


public void butHello_Click(View v){
    edtext.setText("Здравствуй, друг");
}

Обратите внимание, что имя метода butHello_Click должно совпадать со строкой, которую мы задали в атрибуте android:onClick для кнопки, а также добавляем скобки с текстом View v. В фигурных скобках пишем код, который должен выполниться при щелчке кнопки. Так как нам надо вывести текст в текстовом поле, то просто присваиваем нужный текст через метод setText.

Полный текст кода для HelloWorld.java будет выглядеть следующим образом.


package ru.alexanderklimov.helloworld;

import android.app.Activity;
import android.os.Bundle;

import android.widget.EditText;
import android.view.View;

public class HelloWorld extends Activity {
	
	private EditText edtext;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        edtext = (EditText)findViewById(R.id.editText1);    
    }
 
    public void butHello_Click(View v){
        edtext.setText("Здравствуй, друг");
    }
}

Здесь стоит обратить внимание на строчку edtext = (EditText)findViewById(R.id.editText1);. Метод findViewById используется для получения ссылки на элемент, у которого мы определили ID. В дальнейшем вы постоянно будете использовать данный код в своих программах.

Код для щелчка мыши

Новички на первых порах часто делают элементарную ошибку - помещают строчку инициализации объекта до метода setContentView(). Запомните, сначала нужно вывести шаблон (R.layout.main), а только потом кнопки, текстовые поля, переключатели и т.д.

Другой способ обработки щелчка кнопки

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

Добавьте в проект новую кнопку. Если первую кнопку мы добавляли перетаскиванием элемента Button с панели инструментов, то на этот раз мы попробуем создать кнопку вручную. Откройте файл main.xml в режиме редактора кода и скопируйте код для первой кнопки. Потом с новой строки вставьте скопированный текст и подправьте несколько атрибутов, например, так.


<Button android:text="Считаем ворон" 
    android:id="@+id/SecondButton" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"></Button>

Я поменял для кнопки текст и идентификатор, а также растянул кнопку на весь экран (выделено жирным). Переключитесь в графический режим и посмотрите, как выглядит кнопка.

Открываем файл HelloWorld.java и пишем следующий код:


Button butSecond;

Когда вы напишете код, то слева появится предупреждающий значок. Если подвести курсор к значку, то появится всплывающая подсказка: Button cannot be resolved to a type. Теперь подведите курсор к слову Button. Снова появится всплывающее окно, в котором среда разработки предложит вам несколько вариантов исправления ошибки. В нашем случае необходимо выбрать первый вариант: Import 'Button' (android.widget). Тогда у вас в секции Imports в верхней части кода появится строчка import android.widget.Button; и предупреждающий значок исчезнет.

После строчки setContentView(R.layout.main); пишем:


butSecond = (Button)findViewById(R.id.SecondButton);

Рекомендую не копировать текст со страницы, а вводить текст вручную. Так вы быстрее освоете программирование, кроме того научитесь пользоваться системой подсказок Eclipse. Например, попробуйт после ввода первых трех символов fin нажать комбинацию клавиш Ctrl+Space. Вы увидите, как среда разработки сама вставит нужное слово findViewById(), а курсор будет находиться уже между скобками. Продолжайте набирать символ R, а затем символ точки, и увидите новую подсказку. Если подсказка совпадает с вашими намерениями, то нажмите клавишу Enter. Освоившись с системой подсказок, вы повысите скорость набора кода, а также уменьшите количество опечаток.

Ну а мы переходим к самому важному - обработчику щелчка кнопки. Нам понадобится дополнительная переменная-счетчик count, которая будет содержать число подсчитанных ворон (её необходимо разместить выше метода onCreate).


int count = 0;

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


butSecond.setOnClickListener(new OnClickListener() {
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		edtext.setText("Я насчитал " + ++count + " ворон");
	}
});

При этом не забудьте импортировать интерфейс import android.view.View.OnClickListener;

Запускаем приложение и начинаем щелкать по кнопке. При каждом щелчке счетчик count будет увеличиваться на единицу и эта информация будет отображаться на экране.

Итак, мы познакомились с новым способом обработки щелчка кнопки. Какой способ вы предпочтете - зависит от привычек и вкуса.

Счетчик ворон

Теперь у вас есть чрезвычайно полезное приложение Счетчик ворон. Если преподаватель вас неожиданно спросит на занятии, почему вы смотрите в окно с рассеяным видом, вы можете смело достать свой телефон и сказать, что заняты очень важным делом - считаете ворон.

Считаем ворон

Впрочем, программа получилась у нас универсальной, можно считать не только ворон за окном.

Считаем котов