问题描述:
我在RelativeLayout
上有一个TextView
,当用户触摸它时,我想把它涂成红色,当他点击它时,我想转到另一个页面。所以我试图设置一个OnClickListener
来做点击,和一个OnTouchListener
来实现触摸功能(MotionEvent.ACTION_DOWN
),但这种组合不起作用,因为OnTouchListener
使OnClickListener
无功能(不知道为什么)。
在论坛上人们说我们可以通过OnTouch MotionEvent.ACTION_UP
来实现OnClick
,但是这个可以从我的TextView
布局中触发(如果你按下它并将手指从他身上拖出以释放,则会点击TextView),这不是期望的行为,因为我想:
点击=按+释放TextView
你可以调用View.performClick()当action_up。希望能有所帮助。
your_txtView.setOnClickListener(new TextView.OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
your_txtView.setOnTouchListener(new TextView.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
if (MotionEvent.ACTION_DOWN == event.getAction()) {
} else if (MotionEvent.ACTION_UP == event.getAction()) {
v.performClick();
}
return true;
}
});
Adel,是第一次点击的问题,还是你根本没有点击?
有这个问题,如果你有多个可点击的布局,你不会得到任何点击事件的第一次。这是因为它使它首先被选中,然后你得到click事件,试试下面的代码。
private class CustomTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
TextView tv = (TextView) v.findViewById(R.id.single_line_text);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
tv.setTextColor(COLOR_WHEN_PRESSED);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
tv.setTextColor(COLOR_WHEN_RELEASED);
// Action of click goes here
} else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
tv.setTextColor(COLOR_WHEN_RELEASED);
// To handle release outside the layout region
}
return false;
}
}
这是工作在我目前的实现,如果你设置触摸监听器为您的布局。
你还需要在你的布局中设置
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
希望有帮助!!
编辑:另外,在DOWN和UP中都应该有一个标志。设置为DOWN,检查是否设置为UP。这将避免一个bug,即用户可能点击屏幕上的任何地方,然后将鼠标悬停在textview上并释放它。
有同样的问题。通过从ACTION_MOVE返回false来解决。我已经和它斗争了几个小时,尝试了各种各样的方法,但似乎我一直忽视这个小问题……现在就说得通了。当你从onTouch返回true时,进一步的处理被停止,因此OnClickListener不知道任何移动并触发onClick,即使指针已经移动到视图之外。