- Кнопка Android имеет вызов setOnTouchListener, но не переопределяет performClick
- Вариант 1. Создайте собственное представление
- Вариант 2. Отключение предупреждения
- Как имитировать нажатие кнопки с помощью кода?
- Полный список
- Как вызвать Button.performClick в тестовом примере Android JUnit?
- Пользовательский вид вызвал setOnTouchListener, но не переопределяет performClick (класс расширяет Activity NOT View)
- 3 ответов
Кнопка Android имеет вызов setOnTouchListener, но не переопределяет performClick
Когда я пытаюсь добавить onTouchListner() к кнопке, я получаю
Кнопка имеет вызов setOnTouchListener, но не отменяет performClick
предупреждение. Кто-нибудь знает как исправить?
Пользовательское представление вызвало setOnTouchListener, но не переопределяет performClick. Если представление, которое переопределяет onTouchEvent или использует OnTouchListener, не реализует также performClick и вызывает его при обнаружении щелчков, представление может не обрабатывать действия специальных возможностей должным образом. В идеале логика обработки действий щелчка должна быть помещена в View # performClick, поскольку некоторые службы специальных возможностей вызывают performClick, когда должно произойти действие щелчка.
Это предупреждение появляется, потому что Android хочет напомнить вам подумать о слепых или слабовидящих людях, которые могут использовать ваше приложение. Я предлагаю вам посмотреть это видео, чтобы получить краткий обзор того, на что это похоже.
Все стандартные представления пользовательского интерфейса (например Button , TextView и т. Д.) Настроены для предоставления слепым пользователям соответствующей обратной связи через службы доступности. Когда вы пытаетесь самостоятельно обрабатывать сенсорные события, вы рискуете забыть предоставить эту обратную связь. Это то, для чего нужно предупреждение.
Вариант 1. Создайте собственное представление
Обработка событий касания обычно выполняется в настраиваемом представлении. Не отказывайтесь от этого варианта слишком быстро. Это не так уж и сложно. Вот полный пример, TextView который переопределяется для обработки событий касания:
Тогда вы просто использовали бы это так:
См. Мой другой ответ для получения дополнительных сведений о создании настраиваемого представления.
Вариант 2. Отключение предупреждения
В других случаях было бы лучше просто отключить предупреждение. Например, я не уверен, что вы хотите сделать с элементом Button , для которого вам нужны события касания. Если вы должны были сделать пользовательскую кнопку и называется performClick() в , onTouchEvent как я сделал выше для таможни TextView , то он будет вызываться дважды каждый раз , потому что Button уже вызывает performClick() .
Вот пара причин, по которым вы можете просто отключить предупреждение:
- Работа, которую вы выполняете с вашим событием касания, носит только визуальный характер. Это не влияет на фактическую работу вашего приложения.
- Вы бессердечны и не заботитесь о том, чтобы сделать мир лучше для слепых.
- Вам слишком лень копировать и вставлять код, который я дал вам в Варианте 1 выше.
Добавьте следующую строку в начало метода, чтобы подавить предупреждение:
Источник
Как имитировать нажатие кнопки с помощью кода?
Как я могу вызвать событие нажатия кнопки с помощью кода на Android? Я хочу, чтобы кнопка нажала кнопку программно, когда происходит какое-то другое событие.
Та же проблема, с которой я сталкиваюсь
Но я хочу назвать эту функцию OnLoadLayout без OnClickEvent
Существует лучший способ.
Это должно ответить на все ваши проблемы. Каждый вид наследует эту функцию, включая Button, Spinner и т. Д.
Чтобы уточнить, что сказал moonlightcheese: Чтобы вызвать событие нажатия кнопки с помощью кода в Android, выполните следующие действия:
Вы можете сделать это таким образом
Android callOnClick() ( добавленный в API 15 ) иногда может быть лучшим выбором в моем опыте, чем performClick() . Если у пользователя есть звуки выбора, performClick() может привести к тому, что пользователь услышит два performClick() непрерывного выбора, которые несколько накладываются друг на друга, что может быть резким. (Один звук выбора для первого нажатия кнопки пользователя, а затем другой для OnClickListener другой кнопки, который вы вызываете через код.)
Просто напишите эту простую строку кода: –
Где кнопка является ссылочной переменной класса Button и определяется следующим образом:
Если вы не используете аргумент sender , почему бы не реорганизовать реализацию обработчика кнопок для разделения функции и вызвать ее там, где вы хотите (от обработчика кнопок и от другого места).
Во всяком случае, это лучший и более чистый дизайн – код, который нужно называть обработчиком кнопок И из некоторых других мест заслуживает реорганизации для собственной функции. Кроме того, это поможет вам разделить обработку пользовательского интерфейса с кодом логики приложения. У вас также будет хорошее имя для функции, а не только onDateSelectedButtonClick ().
Начиная с API15, вы также можете использовать callOnClick() которые непосредственно вызывают прикрепленное представление OnClickListener. В отличие от performClick (), это вызывает только прослушиватель и не выполняет никаких связанных действий щелчка, таких как сообщение о событии доступности.
Источник
Полный список
В этом уроке мы:
— научимся обрабатывать нажатие кнопки и узнаем, что такое обработчик
Project name: P0091_OnClickButtons
Build Target: Android 2.3.3
Application name: OnClickButtons
Package name: ru.startandroid.develop.onclickbuttons
Create Activity: MainActivity
В layout-файл main.xml напишем следующее и сохраним:
У нас есть TextView с текстом и две кнопки: OK и Cancel. Мы сделаем так, чтобы по нажатию кнопки менялось содержимое TextView. По нажатию кнопки OK – будем выводить текст: «Нажата кнопка ОК», по нажатию Cancel – «Нажата кнопка Cancel».
Открываем MainActivity.java. Описание объектов вынесем за пределы метода onCreate. Это сделано для того, чтобы мы могли из любого метода обращаться к ним. В onCreate мы эти объекты заполним с помощью уже пройденного нами метода findViewById. В итоге должен получиться такой код:
Обновляем секцию import (CTRL+SHIFT+O). Объекты tvOut, btnOk и btnCancel соответствуют View-элементам экрана и мы можем с ними работать. Нам надо научить кнопку реагировать на нажатие. Для этого у кнопки есть метод setOnClickListener (View.OnClickListener l). На вход подается объект с интерфейсом View.OnClickListener. Именно этому объекту кнопка поручит обрабатывать нажатия. Давайте создадим такой объект. Код продолжаем писать в onCreate:
Eclipse подчеркивает OnClickListener красной линией
т.к. пока не знает его. Необходимо обновить секцию import. Жмем CTRL+SHIFT+O, Eclipse показывает нам, что он знает два интерфейса с именем onClickListener и предлагает выбрать. Нам нужен View.OnClickListener, т.к. метод кнопки setOnClickListener принимает на вход именно его.
Итак, мы создали объект oclBtnOk, который реализует интерфейс View.OnClickListener. Объект содержит метод onClick – это как раз то, что нам нужно. Именно этот метод будет вызван при нажатии кнопки. Мы решили, что по нажатию будем выводить текст: «Нажата кнопка ОК» в TextView (tvOut). Реализуем это.
В методе onClick пишем:
Обработчик нажатия готов. Осталось «скормить» его кнопке с помощью метода setOnClickListener.
В итоге должен получится такой код:
Все сохраняем и запускаем. Жмем на кнопку ОК и видим. Что текст изменился
Нажатие на Cancel пока ни к чему не приводит, т.к. для нее мы обработчик не создали и не присвоили. Давайте сделаем это аналогично, как для кнопки OK. Сначала мы создаем обработчик:
Потом присваиваем его кнопке:
Сохраняем, запускаем, проверяем. Обе кнопки теперь умеют обрабатывать нажатия.
Давайте еще раз проговорим механизм обработки событий на примере нажатия кнопки. Сама кнопка обрабатывать нажатия не умеет, ей нужен обработчик (его также называют слушателем — listener), который присваивается с помощью метода setOnClickListener. Когда на кнопку нажимают, обработчик реагирует и выполняет код из метода onClick. Это можно изобразить так:
Соответственно для реализации необходимо выполнить следующие шаги:
— создаем обработчик
— заполняем метод onClick
— присваиваем обработчик кнопке
и система обработки событий готова.
На следующем уроке:
— научимся использовать один обработчик для нескольких View-элементов
— научим Activity выступать в качестве обработчика
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Как вызвать Button.performClick в тестовом примере Android JUnit?
Я новичок в тестировании Android. Я бы хотел проверить, будет ли нажатие кнопки открыть соответствующую операцию или нет. Я провел некоторое исследование и выяснил, что мне нужно будет использовать ActivityManager для проверки.
Проблема в том, что я не могу заставить работать «щелчок». Я пытаюсь использовать Button.performClick() .
Сначала я только что вызвал эту функцию и получил ошибку, заявив, что не могу сделать этого в текущем потоке. После некоторого googling я узнал, что мне нужно вызвать его в потоке пользовательского интерфейса и наткнулся на runOnUiThread(Runnable r) method .
Кнопка, которую я пытаюсь щелкнуть, – _helloButton_ . Это получается в _setUp()_ method . Я сделал _assertNotNull_ проверить это, чтобы убедиться, что он есть.
В рамках метода тестирования я звоню
И я получаю NPE на линии, вызывающей requestFocus() .
Затем я попробовал
И по-прежнему получают такое же исключение нулевого указателя.
В перспективе JUnit я получаю это сообщение
И stackTrace выглядит так.
Строка 57 – это то, где я helloButton.performClick() .
Я не уверен, почему я получаю NPE; AssertNotNull проходит без проблем. Если вы можете помочь мне в этом вопросе, я бы очень признателен. Заранее спасибо.
EDIT: Я подклассифицирую ActivityInstrumentationTestCase2 для этого конкретного тестового класса.
EDIT2: Logcat извергает некоторые ошибки до появления NPE.
08-05 20: 08: 54.702: ERROR / AndroidRuntime (754): ОШИБКА: сбой присоединения нити
08-05 20: 08: 58.642: ERROR / gralloc (52): дескриптор [unregister] 0x3e1b28 все еще заблокирован (состояние = 40000001)
Вы можете аннотировать ваш тест для работы в потоке пользовательского интерфейса:
Это пример, взятый из руководства по тестированию приложений для Android .
Вы также можете использовать метод runTestOnUiThread (), как показано ниже
Вы принимаете слишком сложный подход к простой проблеме … по существу вам нужен код, структурированный как этот BEWARE, это sudo-код и НЕ будет работать
Источник
Пользовательский вид вызвал setOnTouchListener, но не переопределяет performClick (класс расширяет Activity NOT View)
Я создал Android-активность, реализующую немного OpenCV. Что он делает, это просто создать пользовательский вид камеры, и когда экран коснется, фотография будет сохранена.
моя единственная проблема в том, что код mOpenCvCameraView.setOnTouchListener(MainActivity.this); внутри BaseLoaderCallback содержит предупреждение.
mOpenCvCameraView.setOnTouchListener(MainActivity.this); предупреждает о
пользовательский вид com / example/zcameratestv2/Version2CameraView вызвал setOnTouchListener, но не переопределяет performClick
в отличие от других вопросов, мой класс расширяет Activity not View, поэтому, когда я пытаюсь переопределить функцию private boolean performClick() < . super.performClick(); >он не распознается. Вот мои занятия
ранее public boolean onTouch(View v, MotionEvent event) событие имело аналогичное предупреждение, подобное OnTouchListener, оно показывает, что я должен использовать performClick (); метод, но я не могу переопределить его, так как я расширяюсь до Activity не View . И я обнаружил, что применение v.PerformClick(); исправления этот.
этот другой класс обрабатывает процессы камеры
Я включил необходимые разрешения в файл манифеста, такие как камера и WRITE_EXTERNAL_STORAGE
может кто-нибудь определить проблему? Нужна твоя помощь. Заранее спасибо!
3 ответов
onTouch() метод получает каждое событие касания из базового представления, которое не было отмечено как «обработано». Если Version2CameraView не обрабатывает сенсорные события, они обрабатываются в Activity и your Version2CameraView передается как
вам нужно добавить метод для обработки сенсорных событий, так как ваш вид вызвал setOnTouchListener() , добавьте переопределение метода по умолчанию, обязательно вызовите супер метод внутри, чтобы избежать ошибок, таких как» метод не переопределяет метод из своего суперкласса», вы можете оставить его как мой образец, если вы не собираетесь обрабатывать события касания там:
Я думаю, что это немного поздно, но решение очень простое. Классы как Button , TextView являются подклассами View а также SurfaceView , который является родителем JavaCameraView и Version2CameraView подклассы.
тогда в чем разница? Разница в том, что TextView реализует ‘ ViewTreeObserver.Интерфейс OnPreDrawListener’. По этой причине Button (который является подклассом TextView ) можно переопределить performClick() метод.
как я могу это сделать с моим Version2CameraView класса? Просто реализуйте интерфейс для переопределения performClick() метод. Какой из них, ‘ ViewTreeObserver.OnPreDrawListener’? Нет, вы должны использовать SurfaceHolder.Callback такой:
это решение должно удалить предупреждение, которое у вас есть.
Источник