私はGridViewを持っています。 GridView内の各アイテムは、水平方向(または垂直方向)のレイアウトです(方向によって異なります)。レイアウト内にはImageViewとTextViewがあります。onLongPressの後、gridviewの最初のビューはstartDragでNullPointerExceptionを取得します
GridViewの最初のImageView以外のImageViewで「Long Touch」を実行すると、すべてが計画どおりに機能します。 onLongPress()ハンドラでは、ImageViewでstartDragを呼び出し、すべてが計画どおりに動作します。 GridViewの最初のImageViewで「Long Touch」を実行すると、Android ViewのstartDrag()メソッドでNullPointer例外が発生します。 LocalStateとしてClipData、DragShadowBuilder、そして私のImageViewの -
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を渡された引数のすべてが非nullでいたことを確認することができました。このコードスニペットは次のとおりです。
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(mView);
boolean doingDrag = mView.startDrag(data, shadowBuilder, mView, 0);
startDragはfalseを返し、logcatにはドラッグできないメッセージと例外トレースが含まれています。
これは、gridviewの最初のImageViewでのみ発生します。他のすべてはうまく動作します。
自分のデバイスのビルド/タグを見つけ出すのが試行錯誤でしたが、16281行目がstartDragにあった場所のほんの一部が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トークン= mAttachInfo.mSession ...
私sleuthingが正しければ(私は右JB /ビューを持っています。 Javaソース)、問題はmAttachInfoまたはそのフィールドの1つがnullであると思われます。 shadowSizeは以前に審査され、サーフェスが作成されました。最初のビューが "mAttachInfo"値を持たない何らかの理由はありますか(それはウィンドウにアタッチされていないことを意味します)?または、tryブロック内の他の行である可能性があります(例外が捕捉されています)。
エラーがRemoteLauncher.java:650にあってもよいです。その行に固有のものは何ですか? – Nizam
これは、上のコードでstartDragを呼び出すことになります。 DragShadowBuilder shadowBuilder = new View。DragShadowBuilder(mView); – BJV
それから、 'mView'はnullです。 – Nizam