【问题标题】:After onLongPress, first view in gridview gets NullPointerException in startDrag在 onLongPress 之后,gridview 中的第一个视图在 startDrag 中获取 NullPointerException
【发布时间】:2013-08-16 16:09:13
【问题描述】:

我有一个 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。这是代码sn-p:

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

startDrag 返回 false,并且 logcat 包含 Unable to start drag 消息和异常跟踪。

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

我在 Android 查看源代码中四处寻找线索 - 为我的设备找到构建/标签是反复试验,但我发现 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 之前已经过审查,并且刚刚创建了表面。第一个视图没有“mAttachInfo”值是否有某种原因(假设它没有附加到窗口)?或者它可能是 try 块中的其他行(异常被捕获)。

【问题讨论】:

  • 错误可能在 RemoteLauncher.java:650 处。该行有什么具体内容?
  • 这就是上面代码中对 startDrag 的调用: DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(mView);
  • 那么mView 在那里为空。
  • 我可以向你保证不是。我在那里停止了调试器,它绝对不是空的。此外,mView 不能为空,否则我一开始就无法输入 startDrag()。另外,作为参数的mView实际上只是将自己作为LocalState参数传递。查看 startDrag 源代码时,它甚至在获取 NPE 的行之后才被引用。不过我能看出你的困惑。我在之前的评论中所做的复制/粘贴拉错了行。在这里:boolean doingDrag = mView.startDrag(data, shadowBuilder, mView, 0);
  • 我也遇到了同样的问题,能找到解决方案吗?

标签: android gridview drag-and-drop nullpointerexception


【解决方案1】:

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

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);

【讨论】:

  • 这可能有效,但我放弃并从使用 GridView 切换到使用线性列表。由于我已经修复/尝试过它,所以我很犹豫是否给你“绿色检查”。如果其他人尝试了这个并且它有效,请告诉我,我会检查它。
【解决方案2】:

如果没有附加视图,View#startDrag 会抛出 NPE。

View#isAttachedToWindow 可以告诉您视图是否已附加,但此方法仅在 KITKAT 上可用。

我会提交一个错误。

【讨论】:

    【解决方案3】:

    我知道这是旧的,但我遇到了这个确切的问题。 在我的自定义适配器中,我试图使项目成为方形,所以我正在做类似

    imageView.setLayoutParams(new AbsListView.LayoutParams(width, width));
    

    对我有用的是

    imageView.getLayoutParams().width = width;
    imageView.getLayoutParams().height = width;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多