2013-08-16 15 views
7

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

+0

エラーがRemoteLauncher.java:650にあってもよいです。その行に固有のものは何ですか? – Nizam

+0

これは、上のコードでstartDragを呼び出すことになります。 DragShadowBuilder shadowBuilder = new View。DragShadowBuilder(mView); – BJV

+0

それから、 'mView'はnullです。 – Nizam

答えて

0

ビュー#startDragは、ビューが添付されていない場合はNPEをスローします。

ビュー#isAttachedToWindowは、ビューが接続されているかどうかを確認できますが、このメソッドはKITKATでのみ使用できます。

私はバグを報告します。

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

これはうまくいくかもしれませんが、私はあきらめて、GridViewを使って線形リストを使用するようにしました。私は過去の修正/試しをしているので、私はあなたに "緑色のチェック"を与えることを躊躇しています。他の誰かがこれを試してそれがうまくいくなら、私に知らせてください。私はそれをチェックします。 – BJV

0

私はこれが古いと知っていますが、私はこの正確な問題に遭遇しました。私はアイテムの広場を作るしようとしていたので、私は私のために働いた何

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

のようなものをやっていた私のカスタムアダプタで は

imageView.getLayoutParams().width = width; 
imageView.getLayoutParams().height = width; 
関連する問題