我通过覆盖touchevent()
为我的自定义editext添加了拖拽功能现在的问题是在将edittext拖放到特定位置之后我想通过点击它将文本输入到edittext中,它仍然被拖动可能是因为触摸事件已被覆盖而键盘似乎没有出现输入文字
解决方法可能会在长按时触发拖动功能,但现在edittext的默认longpress功能可能会发生变化
我不希望这种情况发生
怎么做。
mainactivity.java
public class MainActivity extends Activity
{
RelativeLayout dropLayout;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dropLayout = (RelativeLayout) findViewById(R.id.ondraglayout);
dropLayout.setOnDragListener(new MyDragListener());
EditText et = (EditText) findViewById(R.id.mainEditText1);
}
}
my customedittext.java
public class CustomEdittext extends EditText
{
public CustomEdittext(Context context){
super(context);
}
public CustomEdittext(Context context, AttributeSet attr){
super(context, attr);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch(event.getAction()){
case MotionEvent.ACTION_DOWN :
break;
case MotionEvent.ACTION_MOVE :
ClipData dragdata = ClipData.newPlainText("","");
View.DragShadowBuilder shdwbldr = new View.DragShadowBuilder(this);
this.startDrag(dragdata, shdwbldr, this, 0);
this.setVisibility(View.INVISIBLE);
break;
}
return true;
}
}
mydraglistener.java
public class MyDragListener implements OnDragListener
{
private RelativeLayout.LayoutParams params;
@Override
public boolean onDrag(View v, DragEvent event)
{
View view = (View) event.getLocalState();
switch(event.getAction())
{
case DragEvent.ACTION_DRAG_STARTED:
params = (RelativeLayout.LayoutParams) view.getLayoutParams();
break;
case DragEvent.ACTION_DRAG_ENTERED:
int x = (int) event.getX();
int y = (int) event.getY();
break;
case DragEvent.ACTION_DRAG_EXITED :
break;
case DragEvent.ACTION_DRAG_LOCATION :
x= (int) event.getX();
y = (int) event.getY();
break;
case DragEvent.ACTION_DRAG_ENDED :
break;
case DragEvent.ACTION_DROP:
x = (int) event.getX();
y = (int) event.getY();
params.leftMargin = x;
params.topMargin = y;
view.setLayoutParams(params);
view.setVisibility(View.VISIBLE);
break;
default: break;
}
return true;
}
}
my main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#CDC2C0"
android:id="@+id/ondraglayout">
<com.mycompany.myapp.CustomEdittext
android:layout_height="wrap_content"
android:ems="10"
android:layout_width="wrap_content"
android:id="@+id/mainEditText1"/>
答案 0 :(得分:1)
你的整个代码完全没有意义:首先让我们讨论onTouchEvent
内发生的事情:
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch(event.getAction()){
case MotionEvent.ACTION_DOWN :
break;
case MotionEvent.ACTION_MOVE :
ClipData dragdata = ClipData.newPlainText("","");
View.DragShadowBuilder shdwbldr = new View.DragShadowBuilder(this);
this.startDrag(dragdata, shdwbldr, this, 0);
this.setVisibility(View.INVISIBLE);
break;
}
return true;
当您将手指放在屏幕上时,系统首先触发MotionEvent.ACTION_DOWN
,之后,只要系统中没有任何其他内容消耗此事件,她就会发送MotionEvent.ACTION_MOVE
的事件。这个意思就是你对startDrag()
的呼唤会调用手指的每一个动作,这对你说的有意义吗?首先,我建议您将代码从MotionEvent.ACTION_MOVE
移至MotionEvent.ACTION_DOWN
。
现在到了更重要的部分。当您将DragListener
分配给View
时,意思是只要View
返回,此DragEvent
将收到系统将提供的所有Listener
true
的{{1}}。
现在,您已将DragEvent.ACTION_DRAG_STARTED
分配给DragListener
。所以让我们看看你的代码:
RelativeLayout
您为case DragEvent.ACTION_DROP:
x = (int) event.getX();
y = (int) event.getY();
params.leftMargin = x;
params.topMargin = y;
view.setLayoutParams(params);
view.setVisibility(View.VISIBLE);
break;
设置了新的位置,但是LayoutParams
谁将获得此参数? View
,而不是您的RelativeLayout
。实际上,EditText
现在是EditText
,因为您在INVISBLE
内将INVISIBLE
设置为onTouchEvent
并且从未更改过。 view.setVisibility(View.VISIBLE);
中的代码“ACTION_DROP
”不是指EditText
,而是指RelativeLayout
。除非您没有在此处显示其他代码,否则就是这种情况。
无论如何,在您的情况下,我建议您将startDrag()
来电转移到LongCLickListener
。我不知道您认为可能会改变的EditText
哪些功能,至少据我所知,LongClick
中没有EditText
的功能。如果你想避免它,你也可以在你的代码中添加一个标志,然后在ACTION_DROP
之后打开它,然后只要这个标志设置为false,就可以使ACTION_DOWN
内的代码运行。