Кнопка Android требует двух щелчков мыши для действия

У меня есть форма. 7 EditText в вертикальном расположении. На экране в один момент можно увидеть только 3 EditText (форма большая, поэтому мне нужно прокручивать вверх и вниз, чтобы заполнить все поля). Внизу - кнопка.

Когда я заполняю верхний EditText (или один из верхних, который невидим, когда я прокручиваю вниз до кнопки) и фокусирую (курсор) в этом EditText, когда я прокручиваю вниз и пытаюсь нажать кнопку один раз - ничего не происходит. при повторном нажатии - происходит действие кнопки.

Когда видны и EditText с фокусом, и Button - Button требуется один щелчок.

Я думаю, что в первом случае первый щелчок просто фокусирует внимание. И второй щелчок - настоящий щелчок.

Как я могу это исправить? Мне нужно всего лишь один щелчок по кнопке.


person newmindcore    schedule 07.05.2011    source источник
comment
Как это можно повторить: создайте пустой проект с активностью по умолчанию, используйте этот макет pastebin.ca/2054854 Начать проект на реальное устройство - напишите текст вверху EditText, прокрутите вниз до кнопки и нажмите кнопку.   -  person newmindcore    schedule 07.05.2011


Ответы (4)


Вопрос старый, и я не знаю, решит ли это вашу проблему, поскольку ваша ссылка pastebin больше не работает, но поскольку я наткнулся на ваш пост с той же проблемой и нашел решение, я все равно опубликую его:

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

<style name="ButtonStyle" parent="@android:style/Widget.Holo.Button">
    <item name="android:focusable">true</item>
    <item name="android:focusableInTouchMode">true</item>
    <item name="android:clickable">true</item>
    <item name="android:background">@drawable/custom_button</item>
    <item name="android:textColor">@color/somecolor</item>
    <item name="android:gravity">center</item>
</style>

Проблема заключалась в следующей строке:

<item name="android:focusableInTouchMode">true</item>

Как только я удалил его, кнопка заработала, как ожидалось.

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

person maves    schedule 13.04.2012
comment
Спасибо! Исправил для меня. - person locke; 26.04.2014
comment
Этот focusableInTouchMode, ошибочно опубликованный в древнем руководстве, был скопирован в бесчисленные приложения для Android с ошибками. - person Greg Ennis; 04.08.2014

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

input.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    v.performClick();
                }
            }
        });

Мне нужно, чтобы focusableInTouchMode был правдой.

person user2137040    schedule 20.03.2013
comment
ты спас мне жизнь чувак :) - person iBabur; 05.11.2014
comment
@Rajkiran, если требуется, чтобы у вас был android: focusableInTouchMode = true, тогда это решение идеально, в моем случае для focusableInTouchMode должно было быть значение true - person iBabur; 05.11.2014
comment
К вашему сведению, в принятом ответе для кнопки также установлено значение true для атрибута focusableInTouchMode. :) - person Rajkiran; 05.11.2014
comment
В принятом ответе говорится, что эта строка должна быть удалена, чтобы это решение работало. - person user2137040; 21.12.2014
comment
Это может быть проблематично, поскольку он выполняет щелчок по кнопке, если кнопка получает фокус без нажатия. Например, к устройству Android подключена клавиатура, и клавиша Tab используется для переключения фокуса. - person A.J.Bauer; 18.08.2017

Подобно ответу Maves. Это помогло мне:

<Button 
    style="@android:style/Widget.EditText"
    android:focusableInTouchMode="false"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
person Chase Roberts    schedule 30.12.2015

Старый вопрос я знаю. В любом случае у меня была та же проблема, и мне нужно было, чтобы кнопка была фокусируемой.
В конце концов, я использовал OnTouchListener.

myButton.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        int action = motionEvent.getAction();
        if (action == MotionEvent.ACTION_DOWN) {
            // do your stuff on down here
        } else if (action == MotionEvent.ACTION_UP) {
            // do your stuff on up here
        }

        // if you return true then the event is not bubbled e.g. if you don't want the control to get focus or other handlers..

        return false;                 
    }
});
person A.J.Bauer    schedule 18.08.2017
comment
Спасибо! Мне было сложно указать фокус в настраиваемом представлении, поэтому мне пришлось включить focusableInTouchMode, из-за чего кнопки требуют двух касаний. Это решение работает идеально и с меньшей вероятностью вызовет странные побочные эффекты, чем подход onClick. - person Sakiboy; 04.06.2020