我GridLayout
为父级,5x5 = 25 TextViews
动态创建为GridLayout
的孩子。
我想这样做:当我触摸并移动孩子当前触摸的孩子来改变文本。我尝试在每个setOnTouchListener
上实施TextView
,但每次调用onTouch
,但onTouch
返回的视图始终是第一个被触摸的子视图。
for (int row = 0; row < 25; row++) {
for (int col = 0; col < 25; col++) {
final TextView textView= new TextView(this);
textView.setText(Integer.toString(col));
textView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
changeViewText(view);
return true;
}
}
});
gridLayout.addView(pixelView);
}
}
有人可以告诉我我做错了吗?
答案 0 :(得分:1)
侦听器在第一次创建时保留“textView”变量的引用。
将changeViewText(textView);
更改为changeViewText((TextView) view);
,以便每个侦听器都会影响其附加的TextView。
答案 1 :(得分:0)
这就是调度触摸事件的方式,因为你第一次触摸第一个视图时,它已经请求消耗所有其他事件,当将手指拖出视图时,你仍然会收到带有X的事件,Y不在你的首先在第一个View侦听器中查看。
唯一的解决方案是在GridLayout上覆盖dispatchTouchEvent。
例如:
public class MyGridLayout extends GridLayout {
@Override
public boolean dispatchTouchEvent(MotionEvent e) {
for(View v : getChildren())
if (BoundsUtils.getBounds(v).contains(e.getX(), e.getY()))
v.onTouchEvent(MotionEvent.obtain(e));
}
RectF getBounds(View v) { return new RectF(e.getLeft(), e.getTop(), e.getRight(), e.getBottom()); }
}