Android studio onclicklistener не работает

Android onClickListener – ошибка Android Studio или моя собственная ошибка?

Предыдущий фрагмент кода был записан с помощью случайных сайтов и ответов из StackOverflow, но почему-то не работает. Я должен добавить, что я являюсь абсолютным новичком при создании приложений, и мой опыт работы с Java также очень ограничен.

Ошибки заключаются в следующем:

  • “setOnClickListener”: отмечен красным.
  • “public void onClick (View v) <“: Здесь “v” по какой-то причине помечается красным. Он продолжает оставаться красным в “String text = v.toString();”.
  • Программа также находит мою точку с запятой избыточной в конце фрагмента.

Я использую бета-версию Android Studio на элементарной ОС, используя OpenJDK.

Я мог бы совершить любое количество ошибок, это точно. Но любой толчок в правильном направлении был бы очень оценен.

Мое предложение: Установите onClick в файле XML и создайте метод в текущем классе.

Согласитесь с графом, что вам нужно @Override метод onClick. Не уверен, что с ним не так. Фактически, когда я набрал ваш пример в Android Studio, я получил 3 буквы в OnClickListener, и он автоматически заполнил остальные, включая @Override.

Кроме того, я не думаю, что v.toString() предоставит вам любую полезную информацию. Если вы хотите, чтобы текст был нажат на кнопку, вам нужно нажать на кнопку, а затем вызвать getText():

или вы могли бы сделать:

Просто вызов v.toString() позволит вам получить описание этой кнопки, а не текст на ней.

Я считаю, что вам нужно @Override метод onClick.

Просто нажмите “ctrl + shift + o” и добавьте 1 библиотеку, которую вы показываете на экране.

Источник

Обработчик нажатия кнопок не работает в Android Studio

Структура каталогов моей деятельности, как показано ниже

Вот почему, чтобы получить идентификатор кнопки, я написал код ниже

Но, по некоторым причинам, когда я нажимаю кнопку, она не приходит внутрь. Я что-то пропустил? Мой код ниже.

Полный код действия

6 ответов

Лучший способ добиться этого — использовать setContentView(R.layout.activity_login) в вашем методе onCreate() , а затем нажать кнопку findViewById(R.id.btnLogin) .

Строка setContentView(R.layout.activity_login); раздувает макет и отображает представления, определенные в вашем XML. Это совершенно другие экземпляры, чем те, которые были созданы предыдущим вызовом inflate() . Вы, кажется, смешиваете способ, которым мы раздуваем представление для фрагмента и способ, которым мы делаем это для действия. В Деятельности мы просто называем setContentView() . Это означает, что вы должны изменить свой код на следующее:

Теперь код для установки OnClickListener найдет правильную кнопку.

Обратите внимание, что первые две строки onCreate() всегда будут такими, как показано здесь. Единственным отличием будет имя макета, используемого в setContentView() . Вы избежите сильной головной боли, если будете всегда следовать этой схеме.

Предполагая, что вы сделали то, что говорит @ Code-Apprentice (поместите что-то для выполнения), могут произойти другие вещи:

Кнопка clickable ? Проверьте это в макете или установите с помощью

такое кнопка enabled ? Так же, как и раньше.

есть ли другое View перекрывающее кнопку, которая ловит щелчок перед ним?

Удалите View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false); и замените его setContentView

Может быть намерение находится под OnActivityResult, не выходя на улицу

Так что просто удалите этот метод button.setonclicklitner () из OnactivityResult

Прежде всего, в Activity вам не нужно раздувать макет, вы связываете его с помощью метода setContentView :

Во-вторых, если вы хотите сделать это анонимным способом, вы готовы пойти, но добавьте что-то в метод onClick:

Или вы можете сделать это так:

Если вы делаете это таким образом, вы должны реализовать View.OnClickListener в своей деятельности с помощью:

И, наконец, опять же, если вы ничего не делаете в своем методе кликов, Android не сделает этого, поэтому:

Источник

Метод Android onClick не работает на пользовательском представлении

Я начал работать над приложением. Я создаю меню вчера, но метод onClick не работает! Я создал класс, который расширяет представление и вызывает ее MainMenuObject – этот класс предназначен для любого объекта в главном меню (кнопки, логотипы и т. Д.). Я создал для них специальный класс, потому что я запускаю анимацию при запуске меню. После того как я построил класс MainMenuObject, я построил еще один класс (OpeningTimesView), который расширяет представление и будет иметь все кнопки главного меню в нем и будет функционировать как макет основной деятельности.

Все было хорошо, анимация прошла очень хорошо, и я хотел поместить слушателей на свои кнопки, поэтому я добавил реализацию onClickListener в класс OpenTimesView и переопределил метод onClick. Затем я добавил слушателя к кнопкам с setOnClickListener (this) и setClickable (true), но он не работает! Я пробовал все! Пожалуйста, помогите мне выяснить, что я делаю неправильно. Я добавил тост к методу onClick, который не зависит от какого-либо «if», но он не покажет ни одного.

Читайте также:  Кодеки для андроид android

(Кстати, есть ли способ определить ширину и высоту экрана как переменную, к которой могут обращаться все классы? Она не может быть статичной, потому что вы получаете высоту и ширину от экранного объекта, но должен быть другой способ)

Спасибо заранее, Элад!

У меня была одна и та же проблема – я создал пользовательское представление и когда я зарегистрировал в нем новый Listener, вызвав v.setOnClickListener(new OnClickListener() <. >); Слушателя просто не вызывали.

В моем обычном представлении я также перезаписал public boolean onTouchEvent(MotionEvent event) <. >. Проблема заключалась в том, что я не вызывал метод класса View – super.onTouchEvent(event) . Это решило проблему. Поэтому, если вам интересно, почему ваш слушатель не вызван, вы, вероятно, забыли назвать метод onTouchEvent

Создание пользовательских элементов управления на Android может быть сложным, если вам неудобно работать с UI Framework. Если вы еще этого не сделали, я бы рекомендовал прочитать следующие:

Обратите внимание, что когда макеты объявлены в XML, элементы вложены. Это создает иерархию компоновки, которую вы должны создать самостоятельно при настройке компонента с использованием только кода Java.

Скорее всего, вы попадаете в сенсорную иерархию Android. В отличие от некоторых других популярных мобильных платформ, Android предлагает сенсорные события, начиная с вершины иерархии View и прокладывает себе путь вниз. Классы, которые традиционно занимают более высокие уровни иерархии («Активность» и «Макеты»), имеют в них логику для перетасовки, которые они сами не потребляют.

Итак, что бы я рекомендовал делать, это изменить ваш OpeningTimesView чтобы расширить ViewGroup (суперкласс всех макетов Android) или определенный макет ( LinearLayout , RelativeLayout и т. Д.) И добавить ваши кнопки в качестве детей. Прямо сейчас, похоже, не существует определенной иерархии (кнопки на самом деле не «содержатся» в контейнере, они просто члены), что может сбить с толку вопрос о том, где происходят события.

  1. Прикосновения должны естественным образом стекать к кнопкам, позволяя запускать события щелчка
  2. Вы можете использовать механизмы компоновки Android, чтобы нарисовать ваш взгляд, а не полагаться на код рисования, чтобы сделать все это.

Выберите класс макета, чтобы начать с этого, чтобы вы поместили свои кнопки в свои конечные местоположения. Вы можете использовать рамки анимации в Android или пользовательский код рисования (как и сейчас), чтобы оживить их в любом случае до этого момента. Расположение кнопки и где эта кнопка в настоящее время рисуется , при необходимости может быть очень различной, и именно так работает текущая анимационная платформа в Android (до 3.0) … но это отдельная проблема. У вас также есть AbsoluteLayout , который позволяет размещать и заменять объекты в любом месте … но будьте осторожны с тем, как ваше приложение выглядит на всех устройствах Android с этим (учитывая разные размеры экрана).

Что касается вашего второго пункта о информации о дисплее. Самый простой способ – это просто использовать Context.getResources().getDisplayMetrics() где вам это нужно. Activity наследуется из Context , поэтому они могут напрямую вызвать этот метод. В представлениях всегда есть Context вы можете получить доступ с помощью getContext() . Любые другие классы вы можете просто передать Context в качестве параметра в конструкции (это общий шаблон в Android, вы увидите, что для многих объектов требуется Context , в основном для доступа к Resources ).

Вот пример скелета, чтобы начать игру. Это просто выравнивает три горизонтально один раз в качестве конечного местоположения:

Вы можете настроить это оттуда. Возможно, начиная с кнопок с видимостью, установленной в View.INVISIBLE, пока вы не активируете их с помощью кода рисования или пользовательского объекта Animation, а затем сделайте их видимыми в конечном месте отдыха.

Ключ здесь, однако, заключается в том, что макет достаточно умен, чтобы знать, что когда он получает событие касания, он должен перенаправить его соответствующему ребенку. Вы можете создать пользовательский вид без этого, но вам придется перехватывать все касания в контейнере и выполнять математику, чтобы определить, к какому подразделению нужно вручную переслать событие. Если вы действительно не можете заставить менеджера компоновки работать, это ваш регресс.

Надеюсь, это поможет!

Вы можете просто вызвать функцию performClick () в onTouchEvent вашего пользовательского представления.

Используйте это в своем пользовательском представлении:

Внедрите onClickListener в классе onClickListener , так как это объекты, которые будут реагировать на клики.
Другой альтернативой было бы расширить Button вместо View , потому что вы используете только кнопки там

Обновление: полный пример

Это идея реализовать его непосредственно в интерактивных представлениях. Существует класс TestView который расширяет View и переопределяет onDraw , как вам нужно, а также отвечает на клики. Я оставил любую анимационную реализацию, поскольку у вас есть эта часть, и это не относится к обсуждению ClickListener .
Я тестировал его в эмуляторе Eclair, и он работает так, как ожидалось (сообщение Toast после щелчка).

Читайте также:  Android exception to string

Файл: Test.java

Файла: TestView.java

Если вам требуется несколько кликов, а некоторые не доступны для кликов, вы можете добавить конструктор с логическим аргументом, чтобы определить, прикреплен ли ClickListener или нет в представлении:

Вы должны вызвать setOnClickListener(this) в contructor (s) и реализовать View.OnClickListener на себе.

В этом случае:

У меня есть решение! На самом деле это не решение этой конкретной проблемы, а совершенно новый подход. Я отправил эту тему кому-то, кого знаю, и он сказал мне использовать Анимационный SDK, который имеет андроид (например, Wireless Designs), поэтому вместо того, чтобы делать главную страницу меню с 4 классами, я делаю это только с одним классом, который расширяется Активность и класс анимации предлагает множество вариантов анимации. Я хочу поблагодарить вас обоих за то, что вы помогли мне, вы здоровы. Я добавляю код, если кто-то встретит этот поток с той же проблемой или что-то еще:

Источник

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):

Имя для события можно выбрать произвольное, но лучше не выпендриваться. Далее нужно прописать в классе активности придуманное вами имя метода, который будет обрабатывать нажатие. Метод должен быть открытым (public) и с одним параметром, использующим объект View. Вам нужно выучить пять слов для создания метода, а сам метод поместить в класс (если вы ещё путаетесь в структуре Java-кода, то вставьте метод перед последней фигурной скобкой):

Когда пользователь нажимает на кнопку, то вызывается метод onMyButtonClick(), который в свою очередь генерирует всплывающее сообщение.

Обратите внимание, что при подобном подходе вам не придётся даже объявлять кнопку через конструкцию (Button)findViewById(R.id.button1), так как Android сама поймёт, что к чему. Данный способ применим не только к кнопке, но и к другим элементам и позволяет сократить количество строк кода.

Второй способ — метод setOnClickListener()

Более традиционный способ в Java — через метод setOnClickListener(), который прослушивает нажатия на кнопку. Так как для начинающего программиста код может показаться сложным, то рекомендуется использовать подсказки студии. Вот как это будет выглядеть. Предположим, у вас на экране уже есть кнопка button. В коде вы объявляете её обычным способом:

Следующий шаг — написание метода для нажатия. Напечатайте имя элемента и поставьте точку button. — среда разработки покажет вам список доступных выражений для продолжения кода. Вы можете вручную просмотреть и выбрать нужный вариант, а можно продолжать набирать символы, чтобы ускорить процесс. Так как с нажатиями кнопок вам часто придётся работать, то запомните название его метода (хотя бы первые несколько символов) — набрав четыре символа (seto), вы увидите один оставшийся вариант, дальше можно сразу нажать клавишу Enter, не набирая оставшиеся символы. У вас появится строка такого вида:

Курсор будет находиться внутри скобок и появится подсказка OnClickListener l. Начинайте набирать new OnClickListener. Здесь также не обязательно набирать имя полностью. Набрав слово Oncl, вы увидете нужный вариант и снова нажимайте Enter. В результате вы получите готовую заготовку для обработки нажатия кнопки:

Теперь у вас есть рабочая заготовка и сразу внутри фигурных скобок метода onClick() вы можете писать свой код. Рекомендую потренироваться и набить руку в создании заготовки. Это не так сложно, и с практикой навык закрепится автоматически.

Как вариант, можно вынести код для OnClickListener в отдельное место, это удобно, когда кнопок на экране несколько и такой подход позволит упорядочить код. Удалите предыдущий пример и начните писать код заново. Принцип такой же, немного меняется порядок. В предыдущем примере мы сразу прописали в методе setOnClickListener слушателя new OnClickListener. с методом onClick(). Можно сначала отдельно объявить отдельную переменную myButtonClickListener:

Читайте также:  Красивый фон для клавиатуры андроид

Во время набора активно используйте подсказки через 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. Выбираем его и в коде появится заготовка для нажатия кнопки.

Метод будет реализован не в отдельном объекте-обработчике, а в Activity, который и будет выступать обработчиком. В методе onCreate() присвоим обработчик кнопке. Это будет объект this, т.е. текущий объект нашей активности.

На первых порах такой способ также покажется вам сложным и непонятным. Со временем и опытом понимание обязательно придёт.

Лично я рекомендую вам использовать первый способ, как самый простой и понятный. Использование второго и третьего способа дадут вам представление, как писать обработчики для других событий, так как кнопка может иметь и другие события. Например, кроме обычного нажатия существует долгое нажатие на кнопку (long click). Один из таких примеров с методом касания я привёл в конце этой статьи.

О том, как обрабатывать щелчки кнопки я написал отдельную статью Щелчок кнопки/Счетчик ворон. Также кнопки часто будут встречаться во многих примерах на сайте. Про обработку длительный нажатий можно прочитать в статье, посвященной ImageButton.

Плодитесь и размножайтесь — это про кошек, а не про кнопки

Когда у вас одна кнопка в окне, то у вас будет один метод, две кнопки — два метода и так далее. Если у вас несколько кнопок, то не обязательно для каждой прописывать свой метод, можно обойтись и одним, а уже в самом методе разделять код по идентификатору кнопки. Если вы посмотрите на код в предыдущих примерах, то увидите, что в методе присутствует параметр View, который и позволяет определить, для какой кнопки предназначен кусок кода:

Предположим, у вас есть три кнопки:

Как видите, мы сократили количество кода. Теперь у нас один обработчик onClick(), в котором прописаны действия для трёх кнопок.

Сделать кнопку недоступной

Иногда нужно сделать кнопку недоступной и активировать её при определённых условиях. Через XML нельзя сделать кнопку недоступной (нет подходящего атрибута). Это можно сделать программно через метод setEnabled():

Как альтернативу можете рассмотреть атрибут android:clickable, который позволит кнопке не реагировать на касания, но при этом вид кнопки останется обычным.

Сделать кнопку плоской

Стандартная кнопка на экране выглядит выпуклой. Но в некоторых случаях желательно использовать плоский интерфейс. Раньше для этих целей можно было использовать TextView с обработкой щелчка. Но теперь рекомендуют использовать специальный стиль borderlessButtonStyle:

Кнопка сохранит своё привычное поведение, будет менять свой цвет при нажатии и т.д.

С появлением Material Design добавились другие стили, например, style=»@style/Widget.AppCompat.Button.Borderless», который является предпочтительным вариантом. Попробуйте также style=»@style/Widget.AppCompat.Button.Borderless.Colored»

Коснись меня нежно

Если вы внимательно понаблюдаете за поведением кнопки, то увидите, что код срабатывает в тот момент, когда вы отпускаете свою лапу, извините, палец с кнопки. Для обычных приложений это вполне нормально, а для игр на скорость такой подход может оказаться слишком медленным. В подобных случаях лучше обрабатывать ситуацию не с нажатием кнопки, а с его касанием. В Android есть соответствующий слушатель OnTouchListener():

У метода onTouch() есть параметр MotionEvent, позволяющий более тонко определять касания экрана. Если произойдет событие, когда пользователь коснулся экрана, то ему будет соответствовать константа ACTION_DOWN. Соответственно, если пользователь уберёт палец, то нужно использовать константу ACTION_UP. Таким образом, можете расценивать щелчок кнопки как комбинацию двух событий — касания и отпускания.

Получить текст с кнопки

Навеяно вопросом с форума. Задача — получить текст кнопки в методе onClick(). У метода есть параметр типа View, у которого нет метода getText(). Для этого нужно привести тип к типу Button.

Если у вас несколько кнопок привязаны к методу onClick(), то щелчок покажет текст нажатой кнопки.

Дополнительное чтение

SwipeButton — кнопка с поддержкой свайпа

Библиотеки

dmytrodanylyk/circular-progress-button — ещё один вариант кнопок с индикатором прогресса.

Источник

Оцените статью