7

私は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 ブロック内の別の行である可能性があります (例外がキャッチされています)。

4

3 に答える 3

0

これは古いことは知っていますが、この正確な問題に遭遇しました。私のカスタムアダプターでは、アイテムを正方形にしようとしていたので、次のようなことをしていました

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

私のために働いたのは

imageView.getLayoutParams().width = width;
imageView.getLayoutParams().height = width;
于 2016-04-06T20:22:00.913 に答える