Урок 10. Один обработчик (OnClickListener) для нескольких кнопок (Buttons) | Android Studio
Вставка
- Опубліковано 24 лип 2024
- Подпишись на Продвинутые курсы по созданию мобильных приложений и игр для андроид на языках Java и Kotlin: www.fandroid.info/category/pr...
В этом уроке вы узнаете, как оптимизировать реализацию слушателей для события нажатия кнопки в android - будем использовать один слушатель (Listener) для нескольких объектов. Также вы узнаете, как заставить TextView реагировать на нажатие, и как обрабатывать нажатие TextView на экране android устройства.
Весь плейлист: • Уроки по основам разра...
Исходный код проекта на Github скачать по ссылке в текстовой версии: www.fandroid.info/urok-10-odin...
Ссылки в видео:
Конструкции выбора в языке Java: www.fandroid.info/konstruktsii...
Группа взаимопомощи Вконтакте для начинающих ANDROID разработчиков и программистов: www.fandroid.info/gruppa-vzaim...
Скачать видеоуроки: www.fandroid.info/skachat-vide...
Поддержите наш проект: www.fandroid.info/spasibo-za-v...
#android #AndroidStudio #startandroid - Наука та технологія
Спасибо за уроки. С нетерпением жду обновлённых уроков на Android Studio
Вот точно бы не помешало. А то приходится кое какие мелочи допетривать самому. Лишнее время отнимает все это.
все понятно. включаем виджеты кнопки и текста, далее присваиваем имя, далее указываем путь до физической кнопки. это если учесть что я сегодня только изучать вас начал. крутые уроки
Видео замечательное.Виталий вам виват за труды
большое спасибо, вот бы еще вызов нового активити по нажатию осветить
Эх... Жалко видео уроки больше не снимает, единственный нормальный контент был по данной теме.
Большое спасибо за уроки)
уроки супер спасибо!
Очень нравится звук Вашей клавиатуры))
Я бы добавил ЧЕТВЕРТЫЙ case для "textView":
case R.id.textView:
button3.setText(R.string.textButton);
break;
И ниже:
textView.setOnClickListener(onClickListener);
Работает.
+Ост Малаш Сделал так же. И в связи с этим возник вопрос: можно для всех View, имеющих метод onClick создать один обработчик и уже в его теле указывать, какой именно элемент необходимо выбрать (как в данном примере)? Или необходимо для разных типов View (кнопки, текстовые поля, чекбоксы) создавать отдельные обработчики?
+Anton Potapenko Понимаю, что возможно некропостинг, но не могу не обратить Ваше внимание на Ваш вопрос, который сам в себе содержит ответ :)
_"можно для всех View, имеющих метод onClick создать один обработчик и уже в его теле указывать, какой именно элемент необходимо выбрать"_
+CarboardTrain да, все работает. Просто хотел уточнить, может есть какие-нибудь подводные камни, о которых не знаю.
+Ост Малаш я, когда смотрел, сделал так же)) Иногда люблю что-то делать наперёд, потом проверять)
если сделать так, то надпись выводится в заголовке, а если как у автора - то на кнопке
не проще было создать еще 1 case для текста?) и странно я недобавлял атрибута clickable для textViev в хмл, но тем не менее все работает :) более того, добавил атрибут для textView android:clickable="false" и все равно все работает
Супер!
для тех кто пытается воссоздать по этим урокам в main activity.java замените ActionBarActivity на AppCompatActivity потому что
ActionBarActivity была объявлена устаревшей с библиотек поддержки версии 22.1.0 в пользу AppCompatActivity
Огромное спасибо за такой титанический труд! не могли бы посоветовать книги по Андроид программированию ?
Спасибо!
Почему на эмуляторе при первом нажатии на любую кнопку button, кнопки уходят немного влево?
возможно ли поле textview дополнять?
Т.е. существет ли какая то команда не settext как у вас а Addtext?
У меня вопрос можно ли создать 1 строковый ресурс и к нему уже в методах приписывать цифры на кнопках
Ну если Вы адепт сокрашения кода, то и обработку нажатия текствью логично было бы в свич засунуть.
что бы было меньше кода можно к классу просто добавить
implements View.OnClickListener и переназначить метод onClick и в нём уже юзать switch case
на nexus 5 при нажатии на кнопки крашиться прога
как это исправить?
При создании кликабельного текста. Я сделал на перед Вашу задучу недосмотрев видео. В результате чего не прописал в main.xml команду clickable. Но приложение все равно работает. Чем это чревато если не прописывать данный текст?
Ребят помогите пожалуйста не получается добавить конструкцию swich. Что с этим делать?
Нужна помощь,при запуска в андроид студио пишет: IllegalArgumentException: Unable to locate adb
я джаву конечно не учил, да и программирование чисто ради баловства изучаю, но что я понял по этому уроку, что в настоящий момент оператор switch требует константные выражения для ускорения сборки и компиляции и по этому уроку шаг в шаг лучше не повторять. Так что лучше здесь обойтись циклом if(){...}
Виталий, почему строка:
android:clickable="true"
никак не влияет на программу? Ибо, если я создал слушатель нажатия для textVeiw, то обработка нажатия происходит и без вышеупомянутой строки (или если значение false).
Эта строка действительно лишняя. Когда textView назначаешь обработчик клика, clickable автоматические на true переходит
если для оптимизации - чем меньше объектов тем лучше, то не лучше ли наследовать MainActivity от OnClickListener и переопределить метод onClick?
Поправьте пожалуйста ссылку на гитхаб
У нас разные версии Android Studio и не чего не сходится, было бы не плохо еслив вы обновили свою версию до той которую сами посоветовали скачать с сайта
Жаль что долго ждать новых уроков приходится( а так норм
на 5.58 минуте у Вас в эмуляторе меняется текст (кракозябры меняются), у меня ничего не происходит. Почему?
Виталий, а если потребуется предусмотреть локализацию приложения под разные языки, то файлов под строковые параметры values/strings.xml будет несколько?
+Денис Соколов совершенно верно
Благодарю.
Mission Compited 3,(3) часов просмотра за один день. вот она стремление к изучению Android. Хотя у меня все девайсы apple:D
В части кода
public void onClick(View view) {
switch (view.getId()){
case R.id.button1:
textView.setText(R.string.text1);
textView подчеркивается, студия подсказывает что нужно textView финализировать, и сама подставляет final при инициализации id
final TextView textView = (TextView) findViewById(R.id.textView);
Версия студии 2.1.2, приложение при этом работает. Скажите это с обновлением студия поменялась или почему требует финализировать? Без final TextView при компиляции вылазить ошибка
Error:(31, 25) error: local variable textView is accessed from within inner class; needs to be declared final
Отвечу сам себе. Это я обьявил глобальную переменную textView, а потом локально инициализировал ее)
Сделал все как по уроку, но в эмуляторе при нажатии на кнопки ничего не происходит, код внимательно пересматривал, версия андроид студио 1.5, до этого в предыдущих уроках все получалось
+Евгений Герман версия не при чем, ищите ошибки. Сделайте заново
странно, что as на вас не ругается за отсутствие default в switch
+Игорь Т default в switch не обязателен
Статья про Интерфейсов, в начале пишете что у интерфейсов нет полей, а уже внизу в примера, их объявляете. Или я не правильно понял))
+Кылыч Молдожанов учи основы Java!
public void onClick(View view) {
switch (view.getId()) {
с начало автоматом ставило (View v) и из за этого нельзя было Поставить view.getId(), вроде разобрался
каждый раз делает public void onClick(View v) почему так?
такая же проблема, приходится вручную прописывать v на view
У меня тоже так
+Александр Лазарев нужно было v.getId()
у меня так же , но в чем тут проблема? если стоит в начале View v, то соответсвенно ставим не view.getId() , а v.getId() , так даже быстрее)
View это класс !! view - это экземпляр класса View ( обьект , а еще точнее - ссылка на обьект )
можно написать и View m , а затем чтобы использовать метод .getId() - можно прописать вот так :
m.getId()
Добрый день). Я написал банальный TapTap(где вы нажимаете на кнопки 5 10 15, и к цифре по середине экрана добавляется 5, 10, 15). Но в чем проблема? Проблема в том, что при смене ориентации у меня значение аннулируется, я не могу понять, оно типо при смене запускает новый класс Main и при этом сменная = 0, подскажите пожалуйста.
При смене ориентации активити пересоздается. Чтобы не пересоздавалось, пропишите в манифесте этому активити такой атрибут: android:configChanges="keyboardHidden|orientation|screenSize"
Большое спасибо)
Можно без Switch, просто вывести текст кнопки по идентификатору через Button but =(Button) findViewById(view.getId()) и but.getText
помогите пожалуйста работает только 1я кнопка потом Приложение остановлено(
Решил сделать так, чтобы по нажатию на кнопку менялась картинка в ImageView. В тело case написал как из следующего урока: pic.setImageDrawable(getResources().getDrawable(R.drawable.im2)); Но ничего при нажатии на кнопку не происходит, хоть ошибок в коде студия и не выдает. В чем же может быть дело ?
А когда сделал без case, а один разработчик на одну кнопу - заработало
+Davis Surfer залейте проект в архиве на файлообменник и пришлите ссылку, посмотрим
есть ли метод, позволяющий узнать какая кнопка вызвала обработчик событий?
+Дмитрий Харьков в видео же сказано что метод getId() возвращает идентификатор объекта который вызвал обработчик событий.
а если хотите вытащить текст из кнопки которая вызвала обработчик, то в обработчике объявите новую кнопку и приравняйте ее к view который передается обработчику. Потом можете получить текст кнопки через метод getText(). На студии 1.5 код вот таков
Button btn = (Button)v;
textView.setText(btn.getText());
Это сработает только если обработчик вызывается объектом класса Button
+Nurkanat Khametov Большое спасибо! Да, мне надо было вытащить текст.
Этот способ вообще не работает создал 3 проекта и не в одном он не сработал.
android studio 1.5.1
только что
Мой работающий код:
import androidx.appcompat.app.AppCompatActivity;
import ......
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
TextView textView;
Button button1;
Button button2;
Button button3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rlayout);
textView = (TextView) findViewById(R.id.textView8);
button1 = (Button) findViewById(R.id.button30);
button2 = (Button) findViewById(R.id.button31);
button3 = (Button) findViewById(R.id.button32);
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.button30:
textView.setText(R.string.text1);
break;
case R.id.button31:
textView.setText(R.string.text2);
break;
case R.id.button32:
textView.setText(R.string.text3);
break;
}
}
};
button1.setOnClickListener(onClickListener);
button2.setOnClickListener(onClickListener);
button3.setOnClickListener(onClickListener);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button3.setText(R.string.textButton);
}
});
}
@Override
public void onClick(View v) {
}
};
Вы можете обьяснить синтаксис
TextView textView;
TextView textView = (TextView) findById();
Я метод findById(); знаю а вот другие что то ли обьект то ли приведение типа
Запустил программу второй раз, проблем с кодировкой не возникло, стоит ли в этом случае добавлять что-то в строковые ресурсы,если и так работает?
Это необходимо по многим причинам, и это стандарт
Спасибо за ответ.Извиняюсь за второй вопрос, моя работа постоянно связана с математическими вычислениями,хотелось бы подробнее разобрать написание сложных математических формул в коде, можно ли ожидать появление этого урока?
Помогите пожалуйста android studio подсвечивает красным R Пытался сделать rebuilt не помогло Как решить проблему?
Пересоздайте проект
та же беда
Подскажите пожалуйста, как и где включить отображение горизонтальной линии разделяющей функции в редакторе кода. Да, и огромное спасибо за уроки, редкий и крайне ценный материал, СПАСИБО!
В общих настройках, раздел Editor
Editor>general>appearance>show method separators
привет всем.
на 1:37 (или около того) автор вводит OnClickListener, а андроид студио автоматом заменяет текст на View.OnClickListener. В моем случае так не получается. Как этого добиться? Спасибо
***** Так пропишите сами)
Я так и сделал:-) для меня важно овладеть методами быстрого ввода кода поскольку это сильно экономит время. Я так понимаю у Вас это какая-то настройка андроид студио?
***** у меня так же вводит без настроек
Спасибо буду разбираться.
Уроки хороши, но вот честно, если бы я не был знаком с с++, я не смог понять, что такое конструктор,что есть метод (ака функция) и прочие мелочи на которых построено ООП и как следствие - плохо понимал происходящее в видео, имхо с Сишки лучше всего начинать изучать программирование чем сразу с Java (а у тех у кого нет терпения и им сразу Android подавай, "сфейлятся" с 80% вероятностью на уроке эдак 7-8).
DeathHaZZard именно, этого мне не хватает. пройду курсы С++
Witcher B Не обязательно возьмите любой язык с ООП, если у Вас все с нуля и хотите программировать под Android, то учите Java.
Witcher B А почему не Java ?
hopa android я просто новичок. Спасибо, начну с ява)
Alex Sas да, с нуля. Так и сделаю тогда
Помогите кто нибудь, у Мен ошибка non static method getId() что там не так то модет быть?
+Александр Шерунков Попробуйте заново сделать урок. У меня на 9-м уроке был затуп, постоянно допускал какие то ошибки, в итоге на 3-й раз сделал.
Всегда начинаю проект заново, не тот еще уровень, что бы править ошибки.
Пробурите тоже самое, может проблема решиться (или увидите разницу, что сделали не так в прошлые разы)
Правильнее будет getString(R.string.text1) а не (R.string.text1) . Иначе нельзя сложить строчку с чем либо другим.
Сделал все как у тебя, только на 6 кнопок. Не получилось при запуске на реальном устройстве пишет ошибка приложения. Телефон леново с820, на виртуальных машинах тестить не могу что-то в биосе не пускает программу к эмулятору.
+Дмитрий Класс смотрите текст ошибки в LogCat в Android Studio
Пришел смотреть уроки по android, а не по java, но немного удивился увидев switch .. case вместо привычного приведения типов.
Button button = (Button)view;
textView.setText("Нажата кнопка " + button.getText());
Не подскажете как увеличить шрифт кода в Android Studio? Глаза устают(
Включите в настройках Android Studio масштабирование колесиком мыши с Ctrl yadi.sk/i/XfD7SeWv33krNS
спасибо огромное!
Когда следующий обновленный урок?
MCSkaT4Paca ua-cam.com/video/RqCKvZBek90/v-deo.html
Где новые уроки под Android Studio?
Ост Малаш ua-cam.com/video/RqCKvZBek90/v-deo.html
ругается на button1.setOnClickListener(onClickListener); и не работает ни чего
Будьте осторожны, в новых androidStudio при OnClick(View view) автоматом пишется (View v)
View это класс !! view - это экземпляр класса View ( обьект , а еще точнее - ссылка на обьект )
можно написать и View m , а затем чтобы использовать метод .getId() - можно прописать вот так :
m.getId()
@@maximo6199 Да но не каждый начинающий об этом знает, а в данных уроках поверхностно все излагают
@@frx1692 мнн кажется нечего соваться в андроид если не знаешь основы жавы
Блин жесть это все девелоперс пишет в ручную? Вытекает вопрос: сколько месяцев пишется одно более-менее полезное приложение?
Зависит от опыта, но серьезные приложения обычно в одиночку не делаются
Start Android а средненькие? Типо брать данные с сайта и выявлять в приложение+управление/редактирование этими данными
Ну такое - от недели до месяца, в зависимости от опыта и времени
Как еще убрать кракозябины? То что в видио мне не подходит под такой код с=(a+b)*2;
Text.setText("Решение =" +c);
Почему не подходит? Вместо текста подставьте ссылку на строковый ресурс, в котором и пропишете текст.
если ставлю ссылку не выводит результат
Niko Shut поиграйтесь с настройками кодировки справа внизу в окне проекта
Помогло.Большое спасибо
А как же веселая музыка в конце видео?
Что делать если onClickListener отображается красным текстом ?
Илья Кулёмин пишите View.OnClickListener
Илья Кулёмин немного с этим помучался сам. Что "OnClickListener", что "View.OnClickListener" не помогал.
Погуглил и оказалось, что надо проделать такую маленькую операцию:
"Tools" -> "Android" -> "Sync Project with Gradle Files"
И красный тектс пропал.
у меня и без создания строк в ресурсах текст отображался нормально а не вопросами(на реальном устройстве)
Проблему с кодировкой можно решить гораздо проще.
Справа внизу студии можно выбрать кодировку основного Main: SSMaker.ru/4bc0e128/
Илья Владельщиков я просто показал правильный подход к использованию ресурсов
Предлагаю свой вариант листнера
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v)
{
if (v instanceof Button) {
String textOnButton = ((Button) findViewById(v.getId())).getText().toString();
textOnButton = getResources().getString(R.string.textBase) + textOnButton;
textView.setText(textOnButton);
}
}
};
где ресурс textBase = "Нажата кнопка "
OnClickListener onClickListener = new OnClickListener() Почему так нельзя написать?
Обработчик не работает. Текст не меняется.
Пробовал все уроки от 1-10 не один не получился делал все пошаговой вашей инструкции, допустим в фале где вы пишите одна информация у меня совсем другая поэтому не чего не понятно и не сходится
Привет давай поговорим где нибудь
Привет Виталий у меня предложение ответь мне
Небольшое дополнение:
button1.setOnClickListener(onClickListener) и тд нужно писать в конце метода onCreate, иначе работать ничего не будет!
Вот эти нюансы с тем что что то забыли прописать просто убивают. Я весь мозг сломал, а оказывается обработчик кнопкам не назначили(((
Под это только спать)) Можно как-то поживее быть?)
Denis Stoyanov включи ускоренный просмотр. Будет веселее)
Алмаз Кожамжаров У меня IDEA, можно так monosnap.com/image/p9tbhnuNwgC7Vt33Dg96yQ5CFbncK4 в Android Studio аналогично
2020??
View.OnClickListener onClickListener = new View.OnClickListener()
Сделал тоже самое но с лол и кек
ничто не вечно))
WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
It will be removed at the end of 2018. For more information see: d.android.com/r/tools/update-dependency-configurations.html
Affected Modules: app
WARNING: The specified Android SDK Build Tools version (22.0.1) is ignored, as it is below the minimum supported version (28.0.3) for Android Gradle Plugin 3.4.2.
Android SDK Build Tools 28.0.3 will be used.
To suppress this warning, remove "buildToolsVersion '22.0.1'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.
Remove Build Tools version and sync project
Affected Modules: app
"Нажал на кнопку - поменялся текст" и такая туча кода... при том в разных местах... ужас. Это не к автору... такова эта Java в разработке под Android... чего ж всё так сложно? Сжав зубы продолжаю смотреть и пытаться, но %60 уже не понимаю. А смотреть вводный курс на Java лень хДДД