Java Android中的拖放视图
我基本上是在制作一个漫画式的应用程序,用户可以在其图像中添加多个语音泡泡。我是这方面的新手,我不知道为什么我的应用程序会崩溃。我在这里和那里学习了一些教程,这就是我到目前为止所做的 我可以在运行时用文本创建一个新的文本视图,它的背景是我的9patch语音泡泡。我可以选择文本视图并拖动它。但我一放下它,textview就会粘在那里,应用程序就会崩溃。另外,当我把它放下的时候,原版就留在那里了 我正在添加代码以及图像Java Android中的拖放视图,java,android,drag-and-drop,views,Java,Android,Drag And Drop,Views,我基本上是在制作一个漫画式的应用程序,用户可以在其图像中添加多个语音泡泡。我是这方面的新手,我不知道为什么我的应用程序会崩溃。我在这里和那里学习了一些教程,这就是我到目前为止所做的 我可以在运行时用文本创建一个新的文本视图,它的背景是我的9patch语音泡泡。我可以选择文本视图并拖动它。但我一放下它,textview就会粘在那里,应用程序就会崩溃。另外,当我把它放下的时候,原版就留在那里了 我正在添加代码以及图像 private RelativeLayout mLayout; p
private RelativeLayout mLayout;
private EditText mEditText;
private Button mButton;
private android.widget.RelativeLayout.LayoutParams layoutParams;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLayout = (RelativeLayout) findViewById(R.id.lay);
mEditText = (EditText) findViewById(R.id.editTxt);
mButton = (Button) findViewById(R.id.btnAddNew);
mButton.setOnClickListener(onClick());
TextView textView = new TextView(this);
textView.setText("New text");
findViewById(R.id.lay).setOnDragListener(dragListener);
}
//This creates the new textview
private OnClickListener onClick() {
return new OnClickListener() {
@Override
public void onClick(View v) {
mLayout.addView(createNewTextView(mEditText.getText().toString()));
}
};
}
OnLongClickListener longListener = new OnLongClickListener()
{
@Override
public boolean onLongClick(View v)
{
TextView txtView = (TextView) v;
View.DragShadowBuilder myShadowBuilder = new DragShadowBuilder(txtView);
ClipData data = ClipData.newPlainText("", "");
v.startDrag(data, myShadowBuilder, txtView, 0);
return true;
}
};
OnDragListener dragListener = new OnDragListener()
{
@Override
public boolean onDrag(View v, DragEvent event)
{
int dragEvent = event.getAction();
switch(dragEvent)
{
case DragEvent.ACTION_DRAG_ENTERED:
//dropText.setTextColor(Color.GREEN);
break;
case DragEvent.ACTION_DRAG_STARTED:
//dropText.setTextColor(Color.GREEN);
layoutParams = (RelativeLayout.LayoutParams)
v.getLayoutParams();
break;
case DragEvent.ACTION_DRAG_EXITED:
break;
case DragEvent.ACTION_DROP:
layoutParams.leftMargin = (int)event.getX();
layoutParams.topMargin = (int)event.getY();
v.setLayoutParams(layoutParams);
break;
}
return true;
}
};
private TextView createNewTextView(String text) {
final LayoutParams lparams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
final TextView textView = new TextView(this);
textView.setLayoutParams(lparams);
textView.setText("New text: " + text);
textView.setBackgroundResource(R.drawable.ss);
textView.setWidth(100);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
textView.setOnLongClickListener(longListener);
return textView;
}
日志Cat错误:
12-01 08:30:04.695: E/AndroidRuntime(5339): FATAL EXCEPTION: main
12-01 08:30:04.695: E/AndroidRuntime(5339): java.lang.NullPointerException
12-01 08:30:04.695: E/AndroidRuntime(5339): at com.example.adddragtry.MainActivity$2.onDrag(MainActivity.java:115)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.view.View.dispatchDragEvent(View.java:16371)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1251)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.view.ViewRootImpl.handleDragEvent(ViewRootImpl.java:3838)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.view.ViewRootImpl.access$600(ViewRootImpl.java:95)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2999)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.os.Handler.dispatchMessage(Handler.java:99)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.os.Looper.loop(Looper.java:137)
12-01 08:30:04.695: E/AndroidRuntime(5339): at android.app.ActivityThread.main(ActivityThread.java:5041)
12-01 08:30:04.695: E/AndroidRuntime(5339): at java.lang.reflect.Method.invokeNative(Native Method)
12-01 08:30:04.695: E/AndroidRuntime(5339): at java.lang.reflect.Method.invoke(Method.java:511)
12-01 08:30:04.695: E/AndroidRuntime(5339): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-01 08:30:04.695: E/AndroidRuntime(5339): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-01 08:30:04.695: E/AndroidRuntime(5339): at dalvik.system.NativeStart.main(Native Method)
初始化layoutparam后新的Logcat
12-01 10:08:57.116: E/AndroidRuntime(749): FATAL EXCEPTION: main
12-01 10:08:57.116: E/AndroidRuntime(749): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
12-01 10:08:57.116: E/AndroidRuntime(749): at com.example.adddragtry.MainActivity$2.onDrag(MainActivity.java:89)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.view.View.dispatchDragEvent(View.java:16371)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1251)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1188)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1200)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1200)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.view.ViewRootImpl.handleDragEvent(ViewRootImpl.java:3838)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.view.ViewRootImpl.access$600(ViewRootImpl.java:95)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2999)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.os.Handler.dispatchMessage(Handler.java:99)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.os.Looper.loop(Looper.java:137)
12-01 10:08:57.116: E/AndroidRuntime(749): at android.app.ActivityThread.main(ActivityThread.java:5041)
12-01 10:08:57.116: E/AndroidRuntime(749): at java.lang.reflect.Method.invokeNative(Native Method)
12-01 10:08:57.116: E/AndroidRuntime(749): at java.lang.reflect.Method.invoke(Method.java:511)
12-01 10:08:57.116: E/AndroidRuntime(749): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-01 10:08:57.116: E/AndroidRuntime(749): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-01 10:08:57.116: E/AndroidRuntime(749): at dalvik.system.NativeStart.main(Native Method)
layoutParams
从未初始化,因此它将始终为空
因此,当您试图执行这一行时,layoutParams.leftMargin=(int)event.getX()
您将获得一个NPE,因为layoutParams
为空。如果要使用视图的布局参数,请尝试使用:
layoutParams=v.getLayoutParams()代码>在尝试更改其值之前。我这样做了。但我把它摔下来后,它仍在崩溃。但是,现在它没有采取新的立场。请更新异常和代码,以便我们可以帮助您处理新问题error@YehCheez包装器视图是框架布局,而不是相对布局。更改私有android.widget.RelativeLayout.LayoutParams LayoutParams代码>到私有android.widget.FrameLayout.LayoutParams LayoutParams代码>或将xml更改为具有相对布局而不是FrameLayoutOw!愚蠢的错误。成功了。应用程序不再崩溃。但是,后面的一切都消失了(按钮和编辑文本),语音气泡只被设置到一个地方。