Android onclick view null

Обработка нажатия на отдельный View в элементе списка

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

ПРЕДИСТОРИЯ

Недавно передо мной встала задача: реализовать возможность нажатия на отдельный View в элементе списка. Сложность заключалась в том, что метод onListItemClick() вызывается при нажатии на любую часть элемента списка (неважно, какой View находится под пальцем). Поискав решение, я ничего полезного не нашёл. Проведя несколько экспериментов, я всё-таки достиг цели.

СОЗДАНИЕ ПРОЕКТА

Создадим проект. Имя, пакет, версия ANDROID – на ваше усмотрение. Сначала разметка для элемента списка и Activity:

Я специально использую ListActivity, чтоб сократить урок. Использовать мы будем, разумеется, свой кастомный адаптер. Чтобы не морочиться с SimpleAdapter и его ArrayList > или BaseAdapter с его обязательными методами, я наследую свой адаптер от ArrayAdapter. Я не стал добавлять ViewHolder – он нам сейчас не нужен. Ну и наконец-то, сам код адаптера:

Давайте разбираться, что мы здесь накодили. В методе getView(int position, View convertView, ViewGroup parent) мы создаём вьюху для каждого элемента списка и там же находим кнопку и присваиеваем ей обработчик нажатия. Когда кнопку нажимают, появляется тост с позицией этого элемента. Как видите, всё очень просто! Правда, при этом почему-то перестаёт работать onListItemClick(ListView l, View v, int position, long id) (по крайней мере у меня). Поэтому придётся кодить обработку нажатия на нужную кнопку и на все остальные View в самом адаптере :(. Но можно сделать, как я написал выше — присвоить всем элементам OnClickListener, а потом смотреть — если наша кнопка, то одно действие, иначе — другое. А ещё лучше вынести все другие вьюхи в отдельный LinearLayout или RelativeLayout и присваивать слушатель только ему.

Ну вот в общем-то и всё. Буду рад, если этот пост поможет кому-нибудь.

Источник

Обработчик нажатия кнопок не работает в 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:

Читайте также:  Android codes key keyboard inputmethodservice

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

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

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

Источник

Простой щелчок кнопки

Небольшое отступление

Когда я загорелся желанием изучить программирование под Android, то через поисковый запрос Google попытался получить список русскоязычных сайтов, где имелись руководства для Android. В принципе, документация на английском меня не пугает, но хотелось быстрее вникнуть в особенности программирования. Но обилие новых терминов и понятий на первых порах могли затруднить такое понимание, читая документацию в оригинале. Я честно открыл около двадцати различных ссылок и результат меня разочаровал. Практически везде в качестве руководства предлагалось только две статьи: установка необходимого программного обеспечения и перевод статьи Hello, World с официального сайта developer.android.com. Такое впечатление, что все дружно скопипастили из одного источника, добавили несколько статей из Хабра и все. Буду рад, если кто-то подскажет мне хороший ресурс для совсем начинающих — в идеале статьи должны быть написаны для людей, которые были вообще не знакомы с программированием до знакомства с Android.
Переходим к кнопке. После написания традиционного Hello, World, который выводился в TextView сразу после загрузки приложения, захотелось попробовать что-то более функциональное. Разобравшись с основными принципами размещения элементов в xml-файле, решил переписать Hello, World на более привычный манер. Добавил на форму текстовое поле EditText и кнопку Button, и стал искать в документации способ обработки щелчка. В документации (а также в статьях на Хабре) использовалась такая длинная конструкция:

То ли сказался поздний час, то ли общая усталость, но моя голова отказывалась запоминать эту конструкцию. Возможно для java-разработчиков это стандартная процедура, не вызывающая затруднений, но не для меня.
И тут, перечитывая примеры на Хабре, неожиданно наткнулся на один комментарий, где говорилось, что под Android 2.x можно использовать другую конструкцию. Спасибо, добрый человек! Его ремарка спасла меня. Все можно сделать гораздо проще.
Открываем файл main.xml и ищем тег . Добавляем к нему еще одну строчку:

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

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

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

После такого открытия у меня свалилась гора с плеч. Во-первых, такой код выглядит проще и понятнее для меня. Во-вторых он практически идентичен коду для Windows Phone 7. Сравните код на XAML для кнопки.

Источник

Как я могу запустить Onclick событие программно в android?

У меня есть пользовательский вид с двумя макетами lineat: первый – это заголовок представления, а второй – просмотр деталей.

В пользовательском представлении OnClickListener заголовка Linringayout уже определен: когда он срабатывает, он сворачивает / расширяет второй linearlayout.

Я хочу добавить дополнительные функции в событие OnClickListener моего заголовка (т. Е. Свернуть / развернуть второй макет и показать Toast).

Я не могу изменить исходный код пользовательского представления. Я попытался установить новый OnClickListener, но он скрывает начальное событие (свернуть / развернуть).

Как мне это реализовать?

Исходный код My Custom View:

Я хочу добавить код в уже определенное событие OnClickListener в свою деятельность. Что-то вроде того:

Простым решением было бы получить оригинальный OnClickListener, а затем запустить его в новом:

К сожалению, у View нет getOnClickListner() , но я думаю, вы можете использовать отражение, чтобы получить его. Он сохраняется в поле mOnClickListener ( источник ).

Читайте также:  Сколько по времени длится обновление по андроид

Вот как вы можете определить OnClickListener для вашего макета:

Я действительно не потрудился правильно обрабатывать все исключения, но этого достаточно, чтобы понять эту идею. Это может показаться беспорядочным, но на самом деле это всего лишь 5 строк нового кода для решения вашей проблемы.

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

Теперь, если вы назовете это на своем втором макете в OnClickListener первого макета, я надеюсь, что он должен сделать магию

С SDK 15 вы можете просто вызвать метод:

Если вы не можете изменить код CustomView, у вас есть опция ниже.

  • Расширьте CustomView.
  • Переопределите метод onClick () и привяжите его как прослушиватель к первому макету.
  • Внутри onClick () сначала вызовите super.onClick (), затем добавьте дополнительную функциональность ниже.

Таким образом, вы сохраняете существующий код и добавляете дополнительные функции.

Источник

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

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

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

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

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

У меня была одна и та же проблема – я создал пользовательское представление и когда я зарегистрировал в нем новый 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, чтобы нарисовать ваш взгляд, а не полагаться на код рисования, чтобы сделать все это.
Читайте также:  Что такое cwm для 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 после щелчка).

Файл: Test.java

Файла: TestView.java

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

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

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

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

Источник

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