android - onLongPress 之后,gridview 中的第一个 View 在 startDrag 中获取 NullPointerException

标签 android gridview drag-and-drop nullpointerexception

我有一个 GridView。 GridView 中的每个项目都是水平(或垂直)布局(取决于方向)。在该布局中有一个 ImageView 和一个 TextView。

当我对 GridView 中第一个 ImageView 以外的任何 ImageView 执行“长按”时,一切都按计划进行。在 onLongPress() 处理程序中,我调用 ImageView 上的 startDrag,一切都按计划进行。如果我在 GridView 中的第一个 ImageView 上执行“长按”,我会在 Android View 的 startDrag() 方法中得到一个 NullPointer 异常。

08-16 10:11:04.425: E/View(2456): Unable to initiate drag
08-16 10:11:04.425: E/View(2456): java.lang.NullPointerException
08-16 10:11:04.425: E/View(2456):   at android.view.View.startDrag(View.java:16281)
08-16 10:11:04.425: E/View(2456):   at org.xyzzy.test.GridLauncher$ShortCutTouchListener$ShortcutGestureListener.onLongPress(RemoteLauncher.java:650)
08-16 10:11:04.425: E/View(2456):   at android.view.GestureDetector.dispatchLongPress(GestureDetector.java:675)

我能够验证传递给 startDrag 的所有参数都是非空的 - ClipData、DragShadowBuilder 和我的 ImageView 作为 LocalState。这是该代码 fragment :

ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(mView);
boolean doingDrag = mView.startDrag(data, shadowBuilder, mView, 0);

startDrag 返回 false 并且 logcat 包含无法开始拖动消息和异常跟踪。

这只发生在 gridview 中的第一个 ImageView 上。所有其他的都工作得很好。

我浏览了 Android View 源代码以寻找线索 - 为我的设备找到构建/标签是反复试验,但我发现 startDrag 中第 16281 行的少数几个之一带有标签 jb-mr1-release(我的Nexus 10 是 4.2.1,所以它可能是正确的)。 16281 处的代码是:

Point shadowSize = new Point();
Point shadowTouchPoint = new Point();
shadowBuilder.onProvideShadowMetrics(shadowSize, shadowTouchPoint);

if ((shadowSize.x < 0) || (shadowSize.y < 0) ||
        (shadowTouchPoint.x < 0) || (shadowTouchPoint.y < 0)) {
    throw new IllegalStateException("Drag shadow dimensions must not be negative");
}

if (ViewDebug.DEBUG_DRAG) {
    Log.d(VIEW_LOG_TAG, "drag shadow: width=" + shadowSize.x + " height=" + shadowSize.y
            + " shadowX=" + shadowTouchPoint.x + " shadowY=" + shadowTouchPoint.y);
}
Surface surface = new Surface();
try {
    IBinder token = mAttachInfo.mSession.prepareDrag(mAttachInfo.mWindow,
            flags, shadowSize.x, shadowSize.y, surface);
    if (ViewDebug.DEBUG_DRAG) Log.d(VIEW_LOG_TAG, "prepareDrag returned token=" + token
            + " surface=" + surface);

16281行是try中的第一条语句:IBinder token = mAttachInfo.mSession ...

如果我的调查是正确的(我有正确的 JB/View.java 源),那么问题似乎出在 mAttachInfo 或其字段之一为空。 shadowSize 较早经过审查,表面刚刚创建。是否有某些原因导致第一个 View 没有“mAttachInfo”值(假设它没有附加到窗口)?或者它可能是 try block 中的其他行(异常被捕获)。

最佳答案

我也遇到过这个问题。我通过添加一个包含 View 图像的 ImageView 来解决它,并使用它,因为我会拖动原始 View 并且它正在工作。

Bitmap b = Bitmap.createBitmap(originalView.getWidth(), originalView.getHeight(), Bitmap.Config.ARGB_8888);


Canvas c = new Canvas(b);
            originalView.draw(c);
            mImageView.setImageBitmap(b);
shadowBuilder = new View.DragShadowBuilder(mImageView);
                    mImageView.startDrag(data, shadowBuilder, mImageView, 0);
                    mImageView.setVisibility(View.INVISIBLE);

关于android - onLongPress 之后,gridview 中的第一个 View 在 startDrag 中获取 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277697/

相关文章:

android - 从 SD 卡加载图像时的 gridview 和 setImageBitmap

Jquery:不支持drop事件?

android - Firefox for Android 和 HTML5 canvas 透明度错误

java - 如何创建自定义适配器以使用cardview作为 fragment 内的 ListView

Android-以编程方式选择 GridView 的项目?

android - GridView onItemClickListener 和 onItemSelected 未达到回调函数

javascript - jQuery/HTML5 文件API : Why does no drag event appear to be triggering?

.net - 拖放控制 - 邪恶?

android - 在 Android 模拟器中安装应用程序显示 "This app is not available for your device"

java - Android:提取html源