我有一个由按钮组成的相对布局
当我按下这个按钮时,它会将我创建的新的自定义编辑文本添加到相对布局中
这些自定义编辑文本可以拖放到布局中的任何位置。这部分代码运行良好。
问题是:当我添加第一个自定义编辑文本,并通过拖动它并添加另一个自定义编辑文字来重新定位它时,应用程序的工作方式与预期不同(两个自定义编辑案文重叠)。
为了更好地了解我的问题,请观看此视频
我没有自定义编辑文本,而是用文本视图尝试了相同的代码,它运行良好。你可以在这里观看文本视图示例的视频
也许是因为在按钮的onclick监听器中设置了长点击监听器,以自定义编辑文本
我的主要活动
public class MainActivity extends Activity
{
TextView X, Y;
RelativeLayout dropLayout;
LayoutParams params;
Button addText;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dropLayout = (RelativeLayout) findViewById(R.id.ondraglayout);
dropLayout.setOnDragListener(new MyDragListener());
addText = (Button) findViewById(R.id.mainButton1);
addText.setOnClickListener(new MyButtonClickListener());
X=(TextView) findViewById(R.id.xvalue);
Y=(TextView) findViewById(R.id.yvalue);
dropLayout.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View p1, MotionEvent event)
{
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
int x=(int) event.getX();
int y=(int) event.getY();
X.setText("x coord is " + x);
Y.setText("y coord is " + y);
break;
case MotionEvent.ACTION_MOVE:
x=(int) event.getX();
y=(int) event.getY();
X.setText("x coord is " + x);
Y.setText("y coord is " + y);
break;
}
return true;
}
});
}
}
我的点击收听者
public class MyButtonClickListener implements OnClickListener
{
@Override
public void onClick(View v)
{
ViewGroup relativeParent = (ViewGroup) v.getParent();
CustomEdittext edttxt = new CustomEdittext(v.getContext());
relativeParent.addView(edttxt);
edttxt.setOnLongClickListener(new MyLongClickListener());
}
}
**MyLongClickListner**
public class MyLongClickListner implements OnLongClickListener
{
@Override
public boolean onLongClick(View v)
{
ClipData dragdata = ClipData.newPlainText("","");
View.DragShadowBuilder shdwbldr = new View.DragShadowBuilder(v);
v.startDrag(dragdata, shdwbldr, v, 0);
v.setVisibility(View.INVISIBLE);
return true;
}
}
我的draglistener
public class MyDragListener implements OnDragListener
{
private 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;
}
}
我的自定义编辑文本
public class CustomEdittext extends EditText
{
Paint paint;
public CustomEdittext(Context context){
super(context);
init();
}
public CustomEdittext(Context context, AttributeSet attr){
super(context, attr);
init();
}
public void init(){
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(4);
paint.setColor(Color.BLUE);
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
}
}
我的主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">
<TextView
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_width="wrap_content"
android:layout_alignParentBottom="true"
android:id="@+id/yvalue"/>
<TextView
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_width="wrap_content"
android:layout_above="@id/yvalue"
android:id="@+id/xvalue"/>
<Button
android:layout_height="wrap_content"
android:text="T"
android:layout_width="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:id="@+id/mainButton1"/>
</RelativeLayout>
好吧,经过一些研究,我做到了。以下是实现,对您最初的方法进行了一些更改。
首先,我在某种程度上更改了xml。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ondraglayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#CDC2C0"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/dropLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/xvalue">
</RelativeLayout>
<TextView
android:id="@+id/yvalue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/xvalue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/yvalue"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/mainButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="T" />
</RelativeLayout>
我希望一切都好。
其次,正如您在xml中看到的,添加了另一个空布局。dropLayout是我们放置项目的地方。在你的活动中,参考这个布局,然后在上面设置拖动监听器
dropLayoutNew.setOnDragListener(dragListener);
dropLayoutNew.setOnTouchListener(otl);
触摸式监听器在下面,我评论了你的实现:
private View.OnTouchListener otl = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return true; // the listener has consumed the event
}
};
这是在同一个活动中。现在,关于我所做的最后一个改变。我在MainActivity本身中创建了拖拽侦听器,因为我无法调试代码的那部分,即来自另一个类的拖拽侦听器(单独的问题)。因此,对于拖动侦听器,请将以下代码粘贴到MainActivity中。
View.OnDragListener dragListener = new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
View view = (View) event.getLocalState();
ViewGroup vg = (ViewGroup) v.getParent();
RelativeLayout rl = (RelativeLayout)vg.findViewById(R.id.dropLayout);
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:
int childCountDropped = rl.getChildCount();
System.out.println("Child Count of Views::::::Dropped" + childCountDropped);
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;
}
};
您可以看到添加了一些代码,但它不会改变您的实现。我想检查相对布局中子项目的数量。我最初认为它会让我对目标布局(项目被丢弃的位置)有一个清晰的想法。尽管如此,这一切现在都如你所愿。我在运行6.0的nexus 5模拟器上检查了它。请检查其他版本。
结论:我不确定从另一个类引用拖动侦听器时为什么不起作用,但无论如何,它现在正按照您的意愿工作。同样,onTouchListener的实现与我的不同。也许我们将不得不研究更多的细节。我所做的主要区别是更改放置布局,你在父对象上做,我在另一个子对象上做。休息基本上是一样的。我建议尝试其他一些实现,并与我们分享结果。
我希望这段代码能有所帮助,如果这不起作用,请告诉我。