Arn*_*ati 1 android android-edittext android-event
我很抱歉,如果我做了任何愚蠢的错误,但我找不到这个的来源:我试图在我的EditText"etItem"上实现一个onDrag监听器这是我的代码:
etItem.setOnDragListener(new OnDragListener(){
@Override
public boolean onDrag(View v, DragEvent dragevent) {
if(null!=dragevent && null!=v){
if( dragevent.getAction() == DragEvent.ACTION_DROP )
{
View view = (View) dragevent.getLocalState();
ViewGroup owner = (ViewGroup) view.getParent();
int itemNum = (Integer) view.getTag();
itemAmounts[itemNum] = 0;
owner.removeView(view);
return true;
}
}
return false;
}});
Run Code Online (Sandbox Code Playgroud)
这在我的Samsng Galaxy Grand上工作得很好,但是在Nexus上给了我一个nullpointer.
stackTrace:
03-26 15:47:21.185: E/AndroidRuntime(1439): FATAL EXCEPTION: main
03-26 15:47:21.185: E/AndroidRuntime(1439): java.lang.NullPointerException
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.widget.Editor.onDrop(Editor.java:1797)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.widget.TextView.onDragEvent(TextView.java:8350)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.View.dispatchDragEvent(View.java:16375)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1237)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewRootImpl.handleDragEvent(ViewRootImpl.java:3838)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewRootImpl.access$600(ViewRootImpl.java:95)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2999)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.os.Handler.dispatchMessage(Handler.java:99)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.os.Looper.loop(Looper.java:137)
03-26 15:47:21.185: E/AndroidRuntime(1439): at android.app.ActivityThread.main(ActivityThread.java:5041)
03-26 15:47:21.185: E/AndroidRuntime(1439): at java.lang.reflect.Method.invokeNative(Native Method)
03-26 15:47:21.185: E/AndroidRuntime(1439): at java.lang.reflect.Method.invoke(Method.java:511)
03-26 15:47:21.185: E/AndroidRuntime(1439): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-26 15:47:21.185: E/AndroidRuntime(1439): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-26 15:47:21.185: E/AndroidRuntime(1439): at dalvik.system.NativeStart.main(Native Method)
03-26 15:47:21.345: W/ActivityManager(297): Force finishing activity com.listcalc.main/.MainActivityFree
Run Code Online (Sandbox Code Playgroud)
我认为这是EditTextAndroid中的小部件和拖放API 的错误.我向其他解决方案中链接的问题跟踪器添加了一个帖子,但我会在这里重现它以便于阅读.如果您遇到这种问题,请到跟踪器,虽然和明星的问题,希望能够让Android的工程师知道它(一厢情愿,我知道).
我在尝试使用拖放API EditText在FrameLayout(非常简单的目标)中移动时遇到了4.4.2中的崩溃/错误.我只有一个OnDragListener设置FrameLayout,但显然框架调用所有孩子View的OnDragEvent()回调,如崩溃堆栈跟踪中所示.
崩溃发生在内部类中android.widget.Editor.onDrop(),该方法尝试ClipData从DragEvent传递给方法的信息中访问信息.
1828 void onDrop(DragEvent event) {
1829 StringBuilder content = new StringBuilder("");
1830 ClipData clipData = event.getClipData();
1831 final int itemCount = clipData.getItemCount();
1832 for (int i=0; i < itemCount; i++) {
1833 Item item = clipData.getItemAt(i);
1834 content.append(item.coerceToStyledText(mTextView.getContext()));
1835 }
....
Run Code Online (Sandbox Code Playgroud)
在1830行event.getClipData()返回null.然后在第1831 clipData.getItemCount()行将触发NPE.这似乎只发生在,EditText因为他们有一个android.widget.Editor实例字段,这让我认为这是一个错误/疏忽.
我找到了两个解决方法.
与注释#1中提出的变通方法类似,您可以在将接收Drag事件的Views层次结构中的对象OnDragListener上设置虚拟EditText对象.但是,虚拟听众可以简单地说
myEditText.setOnDragListener( new View.OnDragListener() {
@Override
public boolean onDrag( View v, DragEvent event) {
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
通过返回true所有Drag事件,无论Action的类型是什么(即从调用中获得的操作event.getAction()),您都将告诉框架您已处理事件.这意味着你将拦截拖动事件,它不会通过任何进一步的查看的实际OnDragEvent()回调,从而避免我们在堆栈跟踪看到的崩溃.
(event.getAction() == DragEvent.ACTION_DROP)对于这个虚拟侦听器,没有必要为注释#1中看到一个单独的条件,因为如果你返回false,ACTION_DRAG_STARTED你将永远不会收到该ACTION_DROP事件(你可以通过在ACTION_DROP条件中放置一条日志打印消息来确认这一点,你我会注意到它永远不会被调用,因为你已经false在else条件下返回了.
由于NPE试图访问时发生null ClipData的Editor.onDrop(),你可以简单地提供一个虚拟ClipData的DragEvent,当你开始拖动过程.
这就是我为我的场景做的事情:
... <other code>
ClipData dummyData = ClipData.newPlainText("dummyData", ""); // don't forget to pass empty String
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
v.startDrag(dummyData, shadowBuilder, v, 0);
...
Run Code Online (Sandbox Code Playgroud)
我选择使用辅助方法为我ClipData.newPlainText创建一个简单的纯文本ClipData,因为你不能只ClipData用它的构造函数和null参数构造一个,因为这也会导致崩溃.
所以无论你在哪里开始你的拖拽过程,View.startDrag()一定要提供这个假人ClipData.通过这种解决方法,我不需要假人OnDragListener,我不会得到任何NPE崩溃.
注意:如果您使用第一个解决方法,请知道通过true从虚拟对象返回,OnDragListener您将有效地阻止DragEvent传播到,TextView.onDragEvent()因此将调用其中没有任何代码.我不确定这个的副作用,如果有的话,但它绝对不是一个空方法.
*编辑:在使用EditText小部件进行拖放操作时,我发现有一些非常奇怪的行为,TextView.onDragEvent()如果你采用第二种解决方法,最终会被调用.我注意到当使用ClipData我建议的虚拟对象时,作为第二个参数传递的" dummyData "字符串ClipData.newPlainText()有时会被粘贴/插入到EditTextif中,如果您尝试将窗口小部件拖动一点同时也在文本中移动插入符号框,或通过键入EditText,然后拖动它.
解释起来非常困惑,但我能够可靠地重现它.任何读者都可以看看该方法的源代码,如果他们想要尝试并理解它,但我老老实实地厌倦了试图找出Android工程师对此的奇怪意图.由于这种奇怪的行为,我改变了我的第二种解决方法,将空字符串作为第二个参数传递.这似乎缓解了这个问题.
个人而言,我结束了扩展EditText类,使我自己的,只是覆盖onDragEvent()到return true;并通过不调用父类(即TextView.onDragEvent(),这在本质上是一样的第一个解决方法,但我需要延长EditText反正类添加一些额外的功能.不管是什么原始代码TextView.onDragEvent(),跳过它似乎并没有影响我的个人用例,我没有注意到我需要的任何功能缺乏.
| 归档时间: |
|
| 查看次数: |
1672 次 |
| 最近记录: |