拖放动态添加的编辑文本视图



我有一个由按钮组成的相对布局

当我按下这个按钮时,它会将我创建的新的自定义编辑文本添加到相对布局中

这些自定义编辑文本可以拖放到布局中的任何位置。这部分代码运行良好。

问题是:当我添加第一个自定义编辑文本,并通过拖动它并添加另一个自定义编辑文字来重新定位它时,应用程序的工作方式与预期不同(两个自定义编辑案文重叠)。

为了更好地了解我的问题,请观看此视频

我没有自定义编辑文本,而是用文本视图尝试了相同的代码,它运行良好。你可以在这里观看文本视图示例的视频

也许是因为在按钮的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的实现与我的不同。也许我们将不得不研究更多的细节。我所做的主要区别是更改放置布局,你在父对象上做,我在另一个子对象上做。休息基本上是一样的。我建议尝试其他一些实现,并与我们分享结果。

我希望这段代码能有所帮助,如果这不起作用,请告诉我。

最新更新