androidevent-capturing

First button press not caught by listener


The first time the "edit info" button is pressed nothing happens but the subsequent times it works fine. There are many similar questions and I have red through and tried everything I could with no success.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sharedPrefs = getSharedPreferences(USER_PREFERENCES, MODE_PRIVATE);
    //call function to load previous values, no intteraction with button



        final Button myButton = findViewById(R.id.button);
        myButton.setTag(1);
        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final int status =(Integer) v.getTag();
                if(status == 1) {
                    myButton.setText(getString(R.string.edit_info));
                    setEditable(false);
                    v.setTag(0);
                } else {
                    myButton.setText(getString(R.string.save_info));
                    setEditable(true);
                    v.setTag(1);
                }
            }

        });
       //proposed solution from other question, see note bellow (*)    
        myButton.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP && !v.hasFocus()) {
                    // onClick() is not called when the EditText doesn't have focus,
                    // onFocusChange() is called instead, which might have a different
                    // meaning. This condition calls onClick() when click was performed
                    // but wasn't reported. Condition can be extended for v.isClickable()
                    // or v.isEnabled() if needed. Returning false means that everything
                    // else behaves as before.
                    myButton.performClick();
                }
                return false;
            }
        });
    }

(*) From this question Matěj Hrazdíra proposes adding OnTouchListner but doing this made the button never toggle back.

Here is activity_main.xml

<Button
    android:id="@+id/button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:text="@string/edit_info" />

Solution

  • From the xml the button has already the text "@string/edit_info".
    In onCreate() you set its tag to 1. So the listener will execute:

                myButton.setText(getString(R.string.edit_info));
                setEditable(false);
                v.setTag(0);
    

    So the text does not change.
    After that the subsequent clicks will change its text.
    I don't know what you want exactly, but if in onCreate() you set its tag to 0, you will see change from the 1st click.