Android. Работа с кнопками (Button), событие нажатия на кнопку в мобильном приложении
Создаем проект, выбираем Empty Activity, Activity Name: MainActivity, Layout Name: activity_main. В лайоуте /res/layout/activity_main.xml оставляем вывод текста TextView, добавляем кнопку Button и прописываем для каждого элемента свой id. После нажатия на кнопку будем выводить текст в TextView, который покажет, что событие было обработано.
В итоге /res/layout/activity_main.xml будет выглядеть примерно следующим образом:
TextView и Button — 2 элемента которые нам понадобятся.
Далее в MainActivity (MainActivity.java) добавим описание Button и TextView, для возможности обращения к ним из любого метода класса, инициализируем их в методе onCreate() и заполним с помощью метода findViewById():
package com.firestork.coderstat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity < TextView myTextView; Button myButton; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTextView = (TextView) findViewById(R.id.myTextView); myButton = (Button) findViewById(R.id.myButton); >>
Приступаем к обработке события нажатия на кнопку.
Обработка события нажатия на кнопку в приложении
1 способ. Обработка события нажатия с помощью метода setOnClickListener
Метод setOnClickListener() прослушивает событие нажатия на кнопку. В методе onCreate() вводим имя кнопки myButton, ставим точку (.) и вводим setO, далее студия сама предложит варианты, вот что получится:
myButton.setOnClickListener();
Внутри скобок набираем new O, далее студия подскажет то что необходимо (OnClickListener), в итоге получим следующее:
myButton.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < >>);
Далее с помощью метода setText добавляем изменение текста в TextView:
myTextView.setText("Все ок)");
В итоге обработчик нажатия на кнопку будет выглядеть так:
myButton.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < myTextView.setText("Все ок)"); >>);
Сохраняем, запускаем приложение и жмем кнопку.
Полный код MainActivity (MainActivity.java):
package com.firestork.coderstat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity < TextView myTextView; Button myButton; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTextView = (TextView) findViewById(R.id.myTextView); myButton = (Button) findViewById(R.id.myButton); myButton.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < myTextView.setText("Все ок)"); >>); > >
Код метода OnClickListener() можно вынести отдельно, например для работы с несколькими кнопками. Создаем обработчик нажатия:
OnClickListener oMyButton = new OnClickListener() < @Override public void onClick(View v) < myTextView.setText("Все ок)"); >>;
И присваиваем обработчик для кнопки:
myButton.setOnClickListener(oMyButton);
В таком случае MainActivity (MainActivity.java) примет вид:
package com.firestork.coderstat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.view.View.OnClickListener; public class MainActivity extends AppCompatActivity < TextView myTextView; Button myButton; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTextView = (TextView) findViewById(R.id.myTextView); myButton = (Button) findViewById(R.id.myButton); OnClickListener oMyButton = new OnClickListener() < @Override public void onClick(View v) < myTextView.setText("Все ок)"); >>; myButton.setOnClickListener(oMyButton); > >
2 способ. Обработка события нажатия с помощью интерфейса OnClickListener
Для реализация данного метода необходимо добавить в класс MainActivity интерфейс OnClickListener, делается это следующим образом — implements View.OnClickListener, после чего объявление класса примет вид:
public class MainActivity extends AppCompatActivity implements View.OnClickListenerПосле добавления интерфейса строка будет подчеркнута красным, все из-за того что у нас еще нет метода onClick() интерфейса OnClickListener, чтобы это исправить жмем Alt + Enter (если при нажатии ничего не происходит, то проверьте текущую раскладку, при кириллической раскладке комбинация может не работать, переведите ввод на латинскую раскладку, например на английский) в любом месте подчеркивания, далее выбираем Implemente Methods в открывшимся окне выбираем onClick и жмем ok. После чего в конец класса MainActivity будет добавлен следующий код:
@Override public void onClick(View v)В этот метод добавляем код, который необходимо выполнить по нажатию на кнопку:
@Override public void onClick(View v)Далее в методе onCreate() назначим обработчик для кнопки, в качестве параметра передаем this, т.е. текущий объект:
myButton.setOnClickListener(this);Сохраняем, запускаем приложение и жмем кнопку.
Полный код MainActivity (MainActivity.java):
package com.firestork.coderstat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener < TextView myTextView; Button myButton; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTextView = (TextView) findViewById(R.id.myTextView); myButton = (Button) findViewById(R.id.myButton); myButton.setOnClickListener(this); >@Override public void onClick(View v) < myTextView.setText("Все ок)"); >>3 способ. Обработка события нажатия с помощью атрибута onClick
В данном способе необходимо добавить атрибут onClick для нужной кнопки, есть несколько способов добавления этого атрибута:
1) Открываем activity_main.xml, во вкладке "Design" жмем на нужную кнопку и в окне "Properties", ищем свойство onClick и вводим в пустое поле название метода для обработки события нажатия кнопки.
2) Или откройте файл activity_main.xml в режиме "Text" и добавьте в элемент Button атрибут onClick с названием метода обработки нажатия кнопки:
android:onClick="clickMyBtn"В обоих случаях, код файла activity_main.xml будет выглядеть следующим образом:
Далее открываем класс MainActivity (MainActivity.java) и добавляем код метода clickMyBtn():
public void clickMyBtn(View view)
Сохраняем, запускаем приложение и жмем кнопку.
Полный код MainActivity (MainActivity.java):
package com.firestork.coderstat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity < TextView myTextView; Button myButton; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTextView = (TextView) findViewById(R.id.myTextView); myButton = (Button) findViewById(R.id.myButton); >public void clickMyBtn(View view) < myTextView.setText("Все ок)"); >>3 в 1. Все 3 способа в одном примере
Далее для закрепления можно реализовать все три способа на одном экране, для этого в main_activity.xml добавим 3 кнопки, по одной кнопке на каждый способ, (полный код main_activity.xml):
И сам класс MainActivity со всеми тремя способами (файл MainActivity.java):
package com.firestork.coderstat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.view.View.OnClickListener; public class MainActivity extends AppCompatActivity implements View.OnClickListener < TextView myTextView; Button myButton1; Button myButton2; Button myButton3; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTextView = (TextView) findViewById(R.id.myTextView); myButton1 = (Button) findViewById(R.id.myButton1); myButton2 = (Button) findViewById(R.id.myButton2); myButton3 = (Button) findViewById(R.id.myButton3); OnClickListener oMyButton = new OnClickListener() < @Override public void onClick(View v) < myTextView.setText("Вы использовали 1-й способ"); >>; myButton1.setOnClickListener(oMyButton); myButton2.setOnClickListener(this); > @Override public void onClick(View v) < myTextView.setText("Вы использовали 2-й способ"); >public void clickMyBtn(View view) < myTextView.setText("Вы использовали 3-й способ"); >>Сохраняем, запускаем, проверяем.
Один обработчик нажатия для нескольких кнопок
Часто необходимо сделать один обработчик нажатия для нескольких кнопок, т.к. функционал может практически не отличаться. Приведем пример для всех 3-х способов.
Один обработчик нажатия кнопки для 1-го способа, setOnClickListener
И так в main_activity.xml имеются 3 кнопки:
Открываем класс MainActivity (MainActivity.java) и в обработчик добавляем разный вывод текста в зависимости от нажатой кнопки с помощью конструкции выборки switch case:
OnClickListener oMyButton = new OnClickListener() < @Override public void onClick(View v) < switch (v.getId()) < case R.id.myButton1: myTextView.setText("Вы нажали на 1-ю кнопку"); break; case R.id.myButton2: myTextView.setText("Вы нажали на 2-ю кнопку"); break; case R.id.myButton3: myTextView.setText("Вы нажали на 3-ю кнопку"); break; >> >;И присваиваем кнопкам обработчик:
myButton1.setOnClickListener(oMyButton); myButton2.setOnClickListener(oMyButton); myButton3.setOnClickListener(oMyButton);Сохраняем, запускаем, пробуем.
Полный код MainActivity (MainActivity.java):
package com.firestork.coderstat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.view.View.OnClickListener; public class MainActivity extends AppCompatActivity < TextView myTextView; Button myButton1; Button myButton2; Button myButton3; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTextView = (TextView) findViewById(R.id.myTextView); myButton1 = (Button) findViewById(R.id.myButton1); myButton2 = (Button) findViewById(R.id.myButton2); myButton3 = (Button) findViewById(R.id.myButton3); OnClickListener oMyButton = new OnClickListener() < @Override public void onClick(View v) < switch (v.getId()) < case R.id.myButton1: myTextView.setText("Вы нажали на 1-ю кнопку"); break; case R.id.myButton2: myTextView.setText("Вы нажали на 2-ю кнопку"); break; case R.id.myButton3: myTextView.setText("Вы нажали на 3-ю кнопку"); break; >> >; myButton1.setOnClickListener(oMyButton); myButton2.setOnClickListener(oMyButton); myButton3.setOnClickListener(oMyButton); > >Один обработчик нажатия кнопки для 2-го способа, интерфейс OnClickListener
В данном случае main_activity.xml оставляем как было описано выше (с тремя кнопками) и меняем код класса MainActivity. Добавляем интерфейс, реализацию метода onClick():
@Override public void onClick(View v) < switch (v.getId()) < case R.id.myButton1: myTextView.setText("Вы нажали на 1-ю кнопку"); break; case R.id.myButton2: myTextView.setText("Вы нажали на 2-ю кнопку"); break; case R.id.myButton3: myTextView.setText("Вы нажали на 3-ю кнопку"); break; >>И присваиваем кнопкам обработчик:
myButton1.setOnClickListener(this); myButton2.setOnClickListener(this); myButton3.setOnClickListener(this);Сохраняем, запускаем, пробуем.
Полный код класса MainActivity (MainActivity.java):
package com.firestork.coderstat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener < TextView myTextView; Button myButton1; Button myButton2; Button myButton3; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTextView = (TextView) findViewById(R.id.myTextView); myButton1 = (Button) findViewById(R.id.myButton1); myButton2 = (Button) findViewById(R.id.myButton2); myButton3 = (Button) findViewById(R.id.myButton3); myButton1.setOnClickListener(this); myButton2.setOnClickListener(this); myButton3.setOnClickListener(this); >@Override public void onClick(View v) < switch (v.getId()) < case R.id.myButton1: myTextView.setText("Вы нажали на 1-ю кнопку"); break; case R.id.myButton2: myTextView.setText("Вы нажали на 2-ю кнопку"); break; case R.id.myButton3: myTextView.setText("Вы нажали на 3-ю кнопку"); break; >> >Один обработчик нажатия кнопки для 3-го способа, атрибут onClick
Для этого способа необходимо открыть activity_main.xml и добавить для всех кнопок атрибут android:onClick="clickMyBtn", для всех кнопок один метод:
В класс MainActivity добавляем метод для обработки нажатия:
public void clickMyBtn(View v) < switch (v.getId()) < case R.id.myButton1: myTextView.setText("Вы нажали на 1-ю кнопку"); break; case R.id.myButton2: myTextView.setText("Вы нажали на 2-ю кнопку"); break; case R.id.myButton3: myTextView.setText("Вы нажали на 3-ю кнопку"); break; >>Сохраняем, запускаем, пробуем.
Полный код класса MainActivity будет выглядеть следующим образом (MainActivity.java):
package com.firestork.coderstat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity < TextView myTextView; Button myButton1; Button myButton2; Button myButton3; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTextView = (TextView) findViewById(R.id.myTextView); myButton1 = (Button) findViewById(R.id.myButton1); myButton2 = (Button) findViewById(R.id.myButton2); myButton3 = (Button) findViewById(R.id.myButton3); >public void clickMyBtn(View v) < switch (v.getId()) < case R.id.myButton1: myTextView.setText("Вы нажали на 1-ю кнопку"); break; case R.id.myButton2: myTextView.setText("Вы нажали на 2-ю кнопку"); break; case R.id.myButton3: myTextView.setText("Вы нажали на 3-ю кнопку"); break; >> >Обработчик события непосредственно при нажатии на кнопку
Все выше описанные методы обработки нажатия на кнопку в приложении будут срабатывать после того как вы уберете палец с кнопки, т.е. на отжатие кнопки. Для того что бы добавить обработчик непосредственно при касании, нажатии, на кнопку необходимо использовать слушатель OnTouchListener(). Попробуем его использовать.
В activity_main.xml добавим одну кнопку и текст:
А в класс MainActivity добавляем setOnTouchListener(), в метод onCreate():
myButton.setOnTouchListener(new View.OnTouchListener() < @Override public boolean onTouch(View v, MotionEvent event) < if (event.getAction() == MotionEvent.ACTION_DOWN) < myTextView.setText("Вы нажали на кнопку :)"); >return false; > >);Метод onTouch() содержит параметр MotionEvent, который позволяет настроить обработку в зависимости от касания.
ACTION_DOWN - событие касания по экрану (в данном случае кнопки).
ACTION_UP - соответственно срабатывает когда вы уберете палец с экрана (элемента).
Выведем в TextView информацию при нажатии на кнопку и отжатие:
myButton.setOnTouchListener(new View.OnTouchListener() < @Override public boolean onTouch(View v, MotionEvent event) < switch (event.getAction()) < case MotionEvent.ACTION_DOWN: myTextView.setText("Вы нажали на кнопку :)"); break; case MotionEvent.ACTION_UP: myTextView.setText("Нажмите еще раз"); break; >return false; > >);Сохраняем, запускаем и пробуем.
Полный код класса MainActivity (MainActivity.java):
package com.firestork.coderstat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity < TextView myTextView; Button myButton; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTextView = (TextView) findViewById(R.id.myTextView); myButton = (Button) findViewById(R.id.myButton); myButton.setOnTouchListener(new View.OnTouchListener() < @Override public boolean onTouch(View v, MotionEvent event) < switch (event.getAction()) < case MotionEvent.ACTION_DOWN: myTextView.setText("Вы нажали на кнопку :)"); break; case MotionEvent.ACTION_UP: myTextView.setText("Нажмите еще раз"); break; >return false; > >); > >Дополнительно
Сделать кнопку недоступной
В классе MainActivity в методе onCreate() добавляем следующий код:
myButton.setEnabled(false);Такой код пригодится, если необходимо выключить кнопку при определенных условиях.
Так же можно отключить кнопку в activity_main.xml с помощью атрибута android:enabled="false":
Получить текст кнопки
Button myButton= (Button)view; String myButtonText = myButton.getText().toString(); myTextView.setText(myButtonText);Если у вас есть вопросы или предложения по улучшению кода описанного в статье пишите в комментариях.
Я всегда открыт к конструктивному диалогуButton (Кнопка)
Кнопка - один из самых распространенных элементов управления в программировании. Наследуется от TextView и является базовым классом для класса СompoundButton. От класса CompoundButton в свою очередь наследуются такие элементы как CheckBox, ToggleButton и RadioButton. В Android для кнопки используется класс android.widget.Button. На кнопке располагается текст и на кнопку нужно нажать, чтобы получить результат. Альтернативой ей может служить компонент ImageButton (android.widget.ImageButton), у которого вместо текста используется изображение.
В студии кнопка представлена компонентом Button в разделе Widgets. Управлять размером шрифта, цветом текста и другими свойствами можно через атрибут textAppearance, который задействует системные стили. Выпадающий список данного свойства содержит огромный перечень вариантов. Также вы можете вручную задать конкретные индивидуальные настройки через отдельные свойства.
Если вы растягиваете кнопку по всей ширине экрана (android:layout_width="match_parent"), то дополнительно рекомендую использовать атрибут android:layout_margin (или родственные ему layout_marginRight и layout_marginLeft) для создания отступов от краев экрана (веб-мастера знакомы с этими терминами).
Так как кнопка является наследником TextView, то использует многие знакомые атрибуты: textColor, textSize и др.
Три способа обработки событий нажатий на кнопку
Если вы разместили на экране кнопку и будете нажимать на неё, то ничего не произойдёт. Необходимо написать код, который будет выполняться при нажатии. Существует несколько способов обработки нажатий на кнопку.
Первый способ - атрибут onClick
Относительно новый способ, специально разработанный для Android - использовать атрибут onClick (на панели свойств отображается как On Click):
android:onClick="onMyButtonClick"Имя для события можно выбрать произвольное, но лучше не выпендриваться. Далее нужно прописать в классе активности придуманное вами имя метода, который будет обрабатывать нажатие. Метод должен быть открытым (public) и с одним параметром, использующим объект View. Вам нужно выучить пять слов для создания метода, а сам метод поместить в класс (если вы ещё путаетесь в структуре Java-кода, то вставьте метод перед последней фигурной скобкой):
public void onMyButtonClick(View view) < // выводим сообщение Toast.makeText(this, "Зачем вы нажали?", Toast.LENGTH_SHORT).show(); >
Когда пользователь нажимает на кнопку, то вызывается метод onMyButtonClick(), который в свою очередь генерирует всплывающее сообщение.
Обратите внимание, что при подобном подходе вам не придётся даже объявлять кнопку через конструкцию (Button)findViewById(R.id.button1), так как Android сама поймёт, что к чему. Данный способ применим не только к кнопке, но и к другим элементам и позволяет сократить количество строк кода.
Данный способ не будет работать в фрагментах. Кнопка должна быть частью активности, а не фрагмента.
Второй способ - метод setOnClickListener()
Более традиционный способ в Java - через метод setOnClickListener(), который прослушивает нажатия на кнопку. Так как для начинающего программиста код может показаться сложным, то рекомендуется использовать подсказки студии. Вот как это будет выглядеть. Предположим, у вас на экране уже есть кнопка button. В коде вы объявляете её обычным способом:
Button button = (Button) findViewById(R.id.button);
Следующий шаг - написание метода для нажатия. Напечатайте имя элемента и поставьте точку button. - среда разработки покажет вам список доступных выражений для продолжения кода. Вы можете вручную просмотреть и выбрать нужный вариант, а можно продолжать набирать символы, чтобы ускорить процесс. Так как с нажатиями кнопок вам часто придётся работать, то запомните название его метода (хотя бы первые несколько символов) - набрав четыре символа (seto), вы увидите один оставшийся вариант, дальше можно сразу нажать клавишу Enter, не набирая оставшиеся символы. У вас появится строка такого вида:
button.setOnClickListener()
Курсор будет находиться внутри скобок и появится подсказка OnClickListener l. Начинайте набирать new OnClickListener. Здесь также не обязательно набирать имя полностью. Набрав слово Oncl, вы увидете нужный вариант и снова нажимайте Enter. В результате вы получите готовую заготовку для обработки нажатия кнопки:
button.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < >>);
Теперь у вас есть рабочая заготовка и сразу внутри фигурных скобок метода onClick() вы можете писать свой код. Рекомендую потренироваться и набить руку в создании заготовки. Это не так сложно, и с практикой навык закрепится автоматически.
Как вариант, можно вынести код для OnClickListener в отдельное место, это удобно, когда кнопок на экране несколько и такой подход позволит упорядочить код. Удалите предыдущий пример и начните писать код заново. Принцип такой же, немного меняется порядок. В предыдущем примере мы сразу прописали в методе setOnClickListener слушателя new OnClickListener. с методом onClick(). Можно сначала отдельно объявить отдельную переменную myButtonClickListener:
OnClickListener myButtonClickListener = new OnClickListener() < @Override public void onClick(View v) < >>;
Во время набора активно используйте подсказки через Ctrl+Space. Набрали несколько символов у первого слова и нажимайте эту комбинацию, набрали после слова new несколько символов и снова нажимайте указанную комбинацию - заготовка будет создана за несколько секунд, а вы избежите возможных опечаток.
У нас есть готовая переменная, и теперь, когда вы будете набирать код button.setOnClickListener, то вместо new OnClickListener впишите готовую переменную.
Для новичка описание может показаться сумбурным и не понятным, но лучше самостоятельно проделать эти операции и понять механизм.
Третий способ - интерфейс OnClickListener
Третий способ является родственным второму способу и также является традиционным для Java. Кнопка присваивает себе обработчика с помощью метода setOnClickListener (View.OnClickListener l), т.е. подойдет любой объект с интерфейсом View.OnClickListener. Мы можем указать, что наш класс Activity будет использовать интерфейс View.OnClickListener.
Опять стираем код от предыдущего примера. Далее после слов extends Activity дописываем слова implements OnClickListener. При появлении подсказки не ошибитесь. Обычно первым идёт интерфейс для диалогов, а вторым нужный нам View.OnClickListener.
Название вашего класса будет подчёркнуто волнистой красной чертой, щёлкните слово public и дождитесь появления красной лампочки, выберите вариант Implement methods. Появится диалоговое окно с выделенным методом onClick. Выбираем его и в коде появится заготовка для нажатия кнопки.
@Override public void onClick(View v)Метод будет реализован не в отдельном объекте-обработчике, а в Activity, который и будет выступать обработчиком. В методе onCreate() присвоим обработчик кнопке. Это будет объект this, т.е. текущий объект нашей активности.
button.setOnClickListener(this);
На первых порах такой способ также покажется вам сложным и непонятным. Со временем и опытом понимание обязательно придёт.
Лично я рекомендую вам использовать первый способ, как самый простой и понятный. Использование второго и третьего способа дадут вам представление, как писать обработчики для других событий, так как кнопка может иметь и другие события. Например, кроме обычного нажатия существует долгое нажатие на кнопку (long click). Один из таких примеров с методом касания я привёл в конце этой статьи.
О том, как обрабатывать щелчки кнопки я написал отдельную статью Щелчок кнопки/Счетчик ворон. Также кнопки часто будут встречаться во многих примерах на сайте. Про обработку длительный нажатий можно прочитать в статье, посвященной ImageButton.
Плодитесь и размножайтесь - это про кошек, а не про кнопки
Когда у вас одна кнопка в окне, то у вас будет один метод, две кнопки - два метода и так далее. Если у вас несколько кнопок, то не обязательно для каждой прописывать свой метод, можно обойтись и одним, а уже в самом методе разделять код по идентификатору кнопки. Если вы посмотрите на код в предыдущих примерах, то увидите, что в методе присутствует параметр View, который и позволяет определить, для какой кнопки предназначен кусок кода:
public void onMyButtonClick(View view) < switch(view.getId()) < case R.id.button1: // идентификатор "@+id/button1" showAlertDialog(); break; . >
Предположим, у вас есть три кнопки:
import android.view.View.OnClickListener; public class ButtonDemoActivity extends Activity implements OnClickListener. final Button button1 = (Button)findViewById(R.id.button1); final Button button2 = (Button)findViewById(R.id.button2); final Button button3 = (Button)findViewById(R.id.button3); // устанавливаем один обработчик для всех кнопок button1.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); // анализируем, какая кнопка была нажата. Всего один метод для всех кнопок @Override public void onClick(View v) < switch (v.getId()) < case R.id.button1: editText.setText("Нажата кнопка Button1"); break; case R.id.button2: editText.setText("Нажата кнопка Button2"); break; case R.id.button3: editText.setText("Нажата кнопка Button3"); break; >>
Как видите, мы сократили количество кода. Теперь у нас один обработчик onClick(), в котором прописаны действия для трёх кнопок.
Сделать кнопку недоступной
Иногда нужно сделать кнопку недоступной и активировать её при определённых условиях. Через XML нельзя сделать кнопку недоступной (нет подходящего атрибута). Это можно сделать программно через метод setEnabled():
button.setEnabled(false);
Как альтернативу можете рассмотреть атрибут android:clickable, который позволит кнопке не реагировать на касания, но при этом вид кнопки останется обычным.
Сделать кнопку плоской
Стандартная кнопка на экране выглядит выпуклой. Но в некоторых случаях желательно использовать плоский интерфейс. Раньше для этих целей можно было использовать TextView с обработкой щелчка. Но теперь рекомендуют использовать специальный стиль borderlessButtonStyle:
Кнопка сохранит своё привычное поведение, будет менять свой цвет при нажатии и т.д.
С появлением Material Design добавились другие стили, например, style="@style/Widget.AppCompat.Button.Borderless", который является предпочтительным вариантом. Попробуйте также style="@style/Widget.AppCompat.Button.Borderless.Colored"
Коснись меня нежно
Если вы внимательно понаблюдаете за поведением кнопки, то увидите, что код срабатывает в тот момент, когда вы отпускаете свою лапу, извините, палец с кнопки. Для обычных приложений это вполне нормально, а для игр на скорость такой подход может оказаться слишком медленным. В подобных случаях лучше обрабатывать ситуацию не с нажатием кнопки, а с его касанием. В Android есть соответствующий слушатель OnTouchListener():
Button button = (Button) findViewById(R.id.button); button.setOnTouchListener(new OnTouchListener() < @Override public boolean onTouch(View v, MotionEvent event) < if (event.getAction() == MotionEvent.ACTION_DOWN) < Toast.makeText(getApplicationContext(), "Молодой человек, не прикасайтесь ко мне!", Toast.LENGTH_SHORT).show(); >return false; > >);
У метода onTouch() есть параметр MotionEvent, позволяющий более тонко определять касания экрана. Если произойдет событие, когда пользователь коснулся экрана, то ему будет соответствовать константа ACTION_DOWN. Соответственно, если пользователь уберёт палец, то нужно использовать константу ACTION_UP. Таким образом, можете расценивать щелчок кнопки как комбинацию двух событий - касания и отпускания.
К сожалению, на сегодняшний день в Android нет метода Погладить. Коты недовольны.
Получить текст с кнопки
Навеяно вопросом с форума. Задача - получить текст кнопки в методе onClick(). У метода есть параметр типа View, у которого нет метода getText(). Для этого нужно привести тип к типу Button.
public void onClick(View view)Если у вас несколько кнопок привязаны к методу onClick(), то щелчок покажет текст нажатой кнопки.
Дополнительное чтение
SwipeButton - кнопка с поддержкой свайпа
Как создать плавающую кнопку для Android приложения
Добавьте зависимость Android Design, потому что FAB находится в этой библиотеке. Скопируйте и вставьте её в свой проект.
implementation 'com.android.support:design:28.0.0'
Если вы не знаете, что такое привязка данных и как она работает, рекомендую почитать статьи и документацию.
Я расскажу о привязке данных только то, что понадобится для этого проекта. Для привязки данных вам больше не нужно писать findViewById . Вы можете хранить XML в одной переменной и использовать его в FAB activity.
Чтобы включить привязку данных, вставьте в build.gradle (app level) эти строки:
dataBinding enabled true
>После запуска Activity_fab должен выглядеть так:
Теперь оберните этот код в тег для того, чтобы привязка данных работала.
coordinatorLayout — это мощный FrameLayout . Используйте его, если хотите взаимодействовать с более чем одним дочерним представлением или макетом верхнего уровня decor/chrome.
Давайте добавим LinearLayout в coordinatorLayout . Добавьте следующий код:
android:gravity="center_horizontal"
android:layout_gravity="bottom|end|right"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">Теперь можно добавить плавающую кнопку действия (FAB) в linear layout.
android:id="@+id/fabAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginTop="10dp"
android:layout_marginRight="18dp"
android:layout_marginBottom="18dp"
app:fabSize="normal"
app:rippleColor="@color/white" />Добавьте этот код в colors.xml .
#ffff #cccccc #37474F Нам нужно добавить три иконки, которые будут отображаться на кнопках. Я использую иконки Android Material. Вы можете использовать свои собственные иконки.
Привязываем иконку add к кнопке FAB. Ваш код должен выглядеть так:
android:id="@+id/fabAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginTop="10dp"
android:layout_marginRight="18dp"
android:layout_marginBottom="18dp"
android:src="https://medium.com/nuances-of-programming/@drawable/ic_add" //добавленная иконка add
app:fabSize="normal"
app:rippleColor="@color/white" />Приступим к анимации FAB.
Создайте класс аниматора с именем ViewAnimation.java . Далее добавьте в этот класс все наши методы анимации.
Добавьте следующий метод в класс анимации:
public static boolean rotateFab(final View v, boolean rotate) v.animate().setDuration(200)
.setListener(new AnimatorListenerAdapter() @Override
public void onAnimationEnd(Animator animation) super.onAnimationEnd(animation);
>
>)
.rotation(rotate ? 135f : 0f);
return rotate;
>Вот что должно быть в классе анимации:
Теперь давайте перейдём к классу activity и реализуем нашу анимацию для FAB.
Давайте разберём этот этап:
ActivityFabBinding : нужно для привязки данных. Сначала вы должны написать Activity, затем его имя (я присвоил имя Fab), а затем добавить привязку.
isRotate : логическое значение. Оно зависит от состояния кнопки. Если true, значит FAB повёрнут, а если false — то нет.
bi : я сохранил весь XML в этой переменной, используя методы привязки данных.
Запустите приложение, и вы увидите красивую, плавную анимацию FAB!
Теперь добавим дочерние кнопки FAB, которые будут появляться сверху при нажатии на кнопку add. Вот так:
Чтобы сделать это, откройте свой основной XML, где мы ранее добавили кнопку FAB, и вставьте следующий код FAB:
android:id="@+id/fabMic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_margin="10dp"
android:src="https://medium.com/nuances-of-programming/@drawable/ic_mic"
android:tint="@color/grey_80"
app:backgroundTint="@color/grey_20"
app:fabSize="mini"
app:rippleColor="@color/white" />
android:id="@+id/fabCall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:src="https://medium.com/nuances-of-programming/@drawable/ic_call"
android:tint="@color/grey_80"
app:backgroundTint="@color/grey_20"
app:fabSize="mini"
app:rippleColor="@color/white" />Это дочерние кнопки.
Обратите внимание, что значение fabSize установлено как mini . Сверьте свой код с этим:
Давайте добавим несколько новых функций в файл ViewAnimation.java .
public static void showIn(final View v) v.setVisibility(View.VISIBLE);
v.setAlpha(0f);
v.setTranslationY(v.getHeight());
v.animate()
.setDuration(200)
.translationY(0)
.setListener(new AnimatorListenerAdapter() @Override
public void onAnimationEnd(Animator animation) super.onAnimationEnd(animation);
>
>)
.alpha(1f)
.start();
>
public static void showOut(final View v) v.setVisibility(View.VISIBLE);
v.setAlpha(1f);
v.setTranslationY(0);
v.animate()
.setDuration(200)
.translationY(v.getHeight())
.setListener(new AnimatorListenerAdapter() @Override
public void onAnimationEnd(Animator animation) v.setVisibility(View.GONE);
super.onAnimationEnd(animation);
>
>).alpha(0f)
.start();
>
public static void init(final View v) v.setVisibility(View.GONE);
v.setTranslationY(v.getHeight());
v.setAlpha(0f);
>Эти три функции позволяют добиться плавной анимации для наших мини FAB-ов.
showIn() : отвечает за сворачивание FAB-ов внутрь при нажатии.
showOut() : отвечает за появление FAB-ов при нажатии.
init() : отвечает за то, чтобы кнопки при запуске приложения были скрыты.
Пока ничего не происходит. Давайте шаг за шагом реализуем остальной функционал.
Во-первых, нужно спрятать мини FAB-ы при инициализации. Добавьте следующий код в метод onCreate и запустите приложение.
ViewAnimation.init(bi.fabMic);
ViewAnimation.init(bi.fabCall);Теперь сделаем так, чтобы они появлялись после нажатия на основную кнопку FAB.
Добавьте код в метод onCreate :
bi.fabAdd.setOnClickListener(new View.OnClickListener() @Override
public void onClick(View v) isRotate = ViewAnimation.rotateFab(v, !isRotate);
if(isRotate) ViewAnimation.showIn(bi.fabCall);
ViewAnimation.showIn(bi.fabMic);
>else ViewAnimation.showOut(bi.fabCall);
ViewAnimation.showOut(bi.fabMic);
>
>
>);Давайте добавим прослушиватели для мини FAB-ов.
bi.fabCall.setOnClickListener(new View.OnClickListener() @Override
public void onClick(View v) Toast.makeText(FABActivity.this, "Calling", Toast.LENGTH_SHORT).show();
>
>);
bi.fabMic.setOnClickListener(new View.OnClickListener() @Override
public void onClick(View v)
Toast.makeText(FABActivity.this, "mic", Toast.LENGTH_SHORT).show();
>
>);И снова запускаем приложение.
- Как улучшить скорость сборки проектов Android
- Чистый код в Android
- Лучшие инструменты для разработки приложений под Android
Как создать кнопку в android studio
Одним из часто используемых элементов являются кнопки, которые представлены классом android.widget.Button . Ключевой особенностью кнопок является возможность взаимодействия с пользователем через нажатия.
Некоторые ключевые атрибуты, которые можно задать у кнопок:
- text : задает текст на кнопке
- textColor : задает цвет текста на кнопке
- background : задает фоновый цвет кнопки
- textAllCaps : при значении true устанавливает текст в верхнем регистре. По умолчанию как раз и применяется значение true
- onClick : задает обработчик нажатия кнопки
Итак, изменим код в activity_main.xml следующим образом:
При помощью атрибута android:onClick можно задать метод в коде java, который будет обрабатывать нажатия кнопки. Так, в вышеприведенном примере это метод sendMessage . Теперь перейдем к коду MainActivity и пропишем в нем такой метод:
package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >// Обработка нажатия кнопки public void sendMessage(View view) < TextView textView = findViewById(R.id.textView); EditText editText = findViewById(R.id.editText); textView.setText("Добро пожаловать, " + editText.getText()); >>
При создании метода обработки нажатия следует учитывать следующие моменты:
- Метод должен объявляться с модификатором public
- Должен возвращать значение void
- В качестве параметра принимать объект View . Этот объект View и представляет собой нажатую кнопку
В данном случае после нажатия на кнопку в TextView выводится текст из EditText.
Аналогичный пример полностью в коде MainActivity:
package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < EditText editText; TextView textView; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); ConstraintLayout constraintLayout = new ConstraintLayout(this); textView = new TextView(this); textView.setId(View.generateViewId()); ConstraintLayout.LayoutParams textViewLayout = new ConstraintLayout.LayoutParams( ConstraintLayout.LayoutParams.MATCH_CONSTRAINT, ConstraintLayout.LayoutParams.WRAP_CONTENT ); textViewLayout.topToTop = ConstraintLayout.LayoutParams.PARENT_ID; textViewLayout.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID; textViewLayout.rightToRight = ConstraintLayout.LayoutParams.PARENT_ID; textView.setLayoutParams(textViewLayout); constraintLayout.addView(textView); editText = new EditText(this); editText.setId(View.generateViewId()); editText.setHint("Введите имя"); ConstraintLayout.LayoutParams editTextLayout = new ConstraintLayout.LayoutParams( ConstraintLayout.LayoutParams.MATCH_CONSTRAINT, ConstraintLayout.LayoutParams.WRAP_CONTENT ); editTextLayout.topToBottom = textView.getId(); editTextLayout.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID; editTextLayout.rightToRight = ConstraintLayout.LayoutParams.PARENT_ID; editText.setLayoutParams(editTextLayout); constraintLayout.addView(editText); Button button = new Button(this); button.setText("Ввод"); ConstraintLayout.LayoutParams buttonLayout = new ConstraintLayout.LayoutParams( ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT ); buttonLayout.topToBottom = editText.getId(); buttonLayout.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID; button.setLayoutParams(buttonLayout); constraintLayout.addView(button); button.setOnClickListener(new View.OnClickListener() < public void onClick(View v) < // Обработка нажатия textView.setText("Добро пожаловать, " + editText.getText()); >>); setContentView(constraintLayout); > >
При программном создании кнопки мы можем определить у нее слушатель нажатия View.OnClickListener и с помощью его метода onClick также обработать нажатие:
button.setOnClickListener(new View.OnClickListener() < public void onClick(View v) < // Обработка нажатия >>);