我有一个由按钮组成的相对布局
当我按下此按钮时,它会将我创建的新自定义编辑文本添加到相对布局中
可以将这些自定义编辑文本拖放到布局中的任何位置。这部分代码运行良好。
问题是:
当我添加第一个自定义编辑文本并通过拖动它并添加另一个自定义编辑文本来重新定位它时,应用程序的工作方式很奇怪,与预期不同(这两个自定义编辑文本相互重叠)。
为了更好地理解我的问题,请看这个video
与自定义编辑文本不同的是,我尝试了与textviews相同的代码,其工作正常,您可以观看此视频的textviews示例here
可能是因为在按钮的on click监听器中将on long click listener设置为自定义编辑文本
我的主要活动
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());
}
}
**我的长点击列表器**
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;
}
}
我的吸血鬼
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中看到的,添加了另一个空布局。我们要把东西放在外面。在活动中,引用此布局,然后在其上设置拖动侦听器。
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本身中创建了on-drag监听器,因为我不知何故无法调试这部分代码,即来自另一个类的drag监听器(单独的问题)。因此,对于拖动侦听器,请将下面的代码粘贴到您的主活动中。
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的Nexus5模拟器上检查过。也要检查其他版本。
结论:我不确定当从另一个类引用时,drag listener为什么不工作,但同样,它现在正按您的要求工作。同样,ontouchlistener的实现与我的不同。也许我们得再查一些细节。我做的主要区别是改变了放置布局,你是在父母身上做的,我是在另一个孩子身上做的。其余的基本上都一样。我也建议尝试一些其他的实现,与我们分享结果。
我希望这段代码有帮助,如果不起作用,请告诉我。
关于android - 拖放动态添加的编辑文本 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37729216/