Android Button needs two click for action

2020-08-09 06:27发布

问题:

I have a form. 7 EditText in vertical layout. On screen in one moment can see only 3 EditText (form is big so I need to scroll up and down to fill all fields). In bottom - Button.

When I fill top EditText (or one of top, which is invisible when I scrolled down to button), and focus (cursor) in this EditText, when I scrolled down and try to click Button once - nothing happens. when I click again - happens button action.

When both EditText with focus and Button is visible - Button needs one clicks.

I think that in first case first click just takes focus. And second click is "real" click.

How I can fix it? I need only one click on Button.

回答1:

The question is old and I don't know whether this will solve your problem, since your pastebin link doesn't work anymore, but since I stumbled upon your post with the same problem and I found a solution I will post it anyway:

In my case the problem occured when I applied a custom style to a button following a tutorial:

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

The problem was the following line:

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

Once I removed it the button worked as expected.

Hope this helps.



回答2:

I used the following to solve a similar problem. It automatically clicks on the item again if the first click only gets focus:

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

I needed focusableInTouchMode to be true.



回答3:

Similar to Maves answer. This did the trick for me:

<Button 
    style="@android:style/Widget.EditText"
    android:focusableInTouchMode="false"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>


回答4:

Old question I know. Anyways I had the same problem and needed the button to be focusable.
In the end I did use an 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;                 
    }
});