私はGridViewを持っています。GridView の各項目は、水平 (または垂直) レイアウトです (向きによって異なります)。そのレイアウトの中に ImageView と TextView があります。
GridView の最初のもの以外の ImageView で「ロングタッチ」を実行すると、すべてが計画どおりに機能します。onLongPress() ハンドラーで、ImageView の startDrag を呼び出すと、すべてが計画どおりに機能します。GridView の最初の ImageView で「ロング タッチ」を実行すると、Android ビューの 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、および LocalState としての ImageView) が null でないことを確認できました。そのコード スニペットは次のとおりです。
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 メッセージと例外トレースが含まれます。
これは、グリッドビューの最初の ImageView でのみ発生します。他のすべては問題なく動作します。
Android View のソースを調べて手がかりを探しました。自分のデバイスのビルド/タグを見つけるのは試行錯誤でしたが、16281 行が startDrag にある場所で見つけた数少ないものの 1 つは、タグ 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 またはそのフィールドの 1 つが null にあるように見えます。shadowSize は以前に精査され、サーフェスが作成されたばかりです。最初のビューに「mAttachInfo」の値がない理由はありますか (ウィンドウにアタッチされていないことを意味すると仮定します)。または、try ブロック内の別の行である可能性があります (例外がキャッチされています)。