有人可以帮助我使用我的语法吗?我正在动态地将一些视图(自定义视图)添加到已经在XML中定义的FrameLayout。那些自定义视图是不同类型或相同类型。我可以在屏幕上添加视图,但无法从ViewGroup中删除特定视图(类型相同或不同)。那些包含onTouch()
的自定义视图。
我遇到问题:无法触发long click
,始终需要touch listener
如果用户在长按
时选择一个视图,我必须在这里创建两个选项 编辑:根据tao
建议,如果没有要查看的触摸侦听器,我可以获得长按视图的索引。但我必须实施触控听众以及长按......
我该怎么做?
答案 0 :(得分:3)
如果你的每个观点都有删除按钮或类似的东西,你可以这样做:
yourLayout.setTag(view);
删除部分:
yourLayout.setOnLongClickListener(new Button.OnLongClickListener() {
public boolean onLongClick(View view) {
...
...
yourLayout.removeView((View) view.getTag());
return _value;
}
我希望它可以帮到你。
答案 1 :(得分:3)
好吧,你的问题是“无法触发长时间点击,总是需要触摸听众”,但这不是必须的。我需要更多细节:
修改强>
我手上没有编译器,所以我只输入伪代码来处理自己的长按,对于真实代码,View.java会给你最好的答案。
首先,您需要一个runnable来实现您的行动
class CheckForLongPress implements Runnable {
public void run() {
if (getParent() != null) {
// show toast
}
}
}
其次,修改onTouchEvent以检测长按
boolean onTouchEvent(...) {
switch (event.getAction()) {
case MotionEvent.ACITON_DOWN:
// post a delayed runnable to detecting long press action.
// here mPendingCheckForLongPress is instance of CheckForLongPress
postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLongPressTimeout());
...
break;
case MotionEvent.ACTION_MOVE:
// cancel long press action
if (distance(event, lastMotionEvent) > mTouchSlop) {
removeCallbacks(mPendingCheckForLongPress);
}
...
break;
case MotionEvent.ACTION_UP:
// cancel long press action
removeCallbacks(mPendingCheckForLongPress);
...
break;
再次编辑:
以下是真正的代码,而不是伪代码,这非常简单,并展示了如何在View.onTouchEvent()中处理长按,可能会有所帮助。
public class ItemView extends View {
public ItemView(Context context) {
super(context);
}
public ItemView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ItemView(Context context, AttributeSet attrs) {
super(context, attrs);
}
Runnable mLongPressDetector = new Runnable() {
public void run() {
Toast.makeText(getContext(), "Hello long press", Toast.LENGTH_SHORT).show();
}
};
MotionEvent mLastEvent;
@Override
public boolean onTouchEvent(MotionEvent event) {
mLastEvent = MotionEvent.obtain(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
postDelayed(mLongPressDetector, ViewConfiguration.getLongPressTimeout());
break;
case MotionEvent.ACTION_MOVE:
final int slop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
if (Math.abs(mLastEvent.getX() - event.getX()) > slop ||
Math.abs(mLastEvent.getY() - event.getY()) > slop) {
removeCallbacks(mLongPressDetector);
}
break;
case MotionEvent.ACTION_UP:
removeCallbacks(mLongPressDetector);
break;
}
return true;
}
}
答案 2 :(得分:1)
看这里:
http://developer.android.com/reference/android/view/View.html
有一个int getId()方法。所以每个观点都有独特的观念。你可以用它来永远观看。
答案 3 :(得分:1)
我的问题是如何从中识别所选视图 用户触摸该视图时的一组视图。
我假设TwoPointsDraw
& OnePointDraw
正在扩展View。
所以在这种情况下,你可以做的是在创建TwoPointsDraw.assign对象的唯一标识或标记之后。
TwoPointsDraw drawView = new TwoPointsDraw(context);
drawView.setTag("unique identifier"); <-Must be object type
drawView.setId(unique id); <-must be integer type
当您点击特定视图时。您可以使用。
检查其身份 view.getTag()
或view.getId()
代码段应该看起来像
circle.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Log.i("Long", v.getTag().toString());
return false;
}
});
希望这会对你有所帮助。
答案 4 :(得分:1)
要使OnLongClickListener
正常工作,当你在onTouch函数中检测到长按时,你应该返回false!
例如:
在你的GestureDetector中,为了给你的onLongClickListener提供机会,你应该:
@Override
public boolean onDown(MotionEvent ev) {
return false;
// return super.onTouchEvent(ev);
}
否则:
在您的视图中,实现setOnLongClickListener
函数并保存onLongClickListener
传递的实例。每当检测到长按时,请调用实例的onLongClick
函数。