Sto riscontrando un problema con il mio pulsante che rimane in uno stato evidenziato, dopo aver effettuato le seguenti operazioni:
public class MainActivity extends AppCompatActivity {
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AppCompatButton button = (AppCompatButton) findViewById(R.id.mybutton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Test", "calling onClick");
}
});
button.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP);
v.invalidate();
break;
}
case MotionEvent.ACTION_UP: {
v.getBackground().clearColorFilter();
v.invalidate();
v.performClick();
Log.d("Test", "Performing click");
return true;
}
}
return false;
}
});
}
}
Per quanto riguarda il codice sopra, quando lo utilizzo, mi aspetto che il clic sul pulsante venga gestito dal tocco e, restituendo "vero", la gestione dovrebbe arrestarsi sul touchListener.
Ma non è così. Il pulsante rimane in uno stato evidenziato, anche se viene chiamato il clic.
Quello che ottengo è:
Test - calling onClick
Test - Performing click
d'altra parte, se sto usando il seguente codice, si fa clic sul pulsante, le stesse stampe, ma il pulsante non finisce bloccato in uno stato evidenziato:
public class MainActivity extends AppCompatActivity {
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AppCompatButton button = (AppCompatButton) findViewById(R.id.mybutton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Test", "calling onClick");
}
});
button.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP);
v.invalidate();
break;
}
case MotionEvent.ACTION_UP: {
v.getBackground().clearColorFilter();
v.invalidate();
// v.performClick();
Log.d("Test", "Performing click");
return false;
}
}
return false;
}
});
}
}
Sono un po 'confuso su quale sia la catena di responder all'evento touch. La mia ipotesi è che sia:
1) TouchListener
2) ClickListener
3) ParentViews
Qualcuno può confermare anche questo?