2013-08-16 3 views
7

Ich habe eine GridView. Jedes der Elemente in der GridView ist ein horizontales (oder vertikales) Layout (abhängig von der Ausrichtung). Innerhalb dieses Layouts befindet sich ein ImageView und ein TextView.Nach OnLongPress, erste Sicht in Gridview ruft NullPointerException in StartDrag

Wenn ich eine „Lange Touch“ auf jedem Image andere als die ersten im Gridview durchführen, funktioniert alles wie geplant. Im onLongPress() - Handler rufe ich den startDrag auf dem ImageView auf und alles funktioniert wie geplant. Wenn ich auf der ersten ImageView in der GridView eine lange Berührung mache, erhalte ich in der startDrag() -Methode von Android View eine NullPointer-Ausnahme.

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) 

konnte ich überprüfen, ob alle der zu startgebenen Argumente waren nicht-null - ein ClipData, ein DragShadowBuilder, und mein Image als LocalState. Hier ist das Code-Schnipsel:

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

startdrag den Wert false zurück und die logcat enthält die Unfähig Drag Nachricht und die Ausnahme-Trace zu starten.

Dies geschieht nur beim ersten ImageView in der Gridview. Alle anderen funktionieren gut.

Ich stocherte in der Android Quelle anzeigen auf der Suche nach einem Anhaltspunkt - zu finden, der Build/Tag für mein Gerät war Versuch und Irrtum, aber einer der wenigen, die ich fand, wo Zeile 16281 in StartDrag war mit Tag jb-MR1-Release (mein Nexus 10 ist 4.2.1, also könnte es der richtige sein). Der Code bei 16281 ist:

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

Linie 16281 ist die erste Anweisung im try: IBinder token = mAttachInfo.mSession ...

Wenn mein sleuthing korrekt ist (ich habe das Recht JB/Blick. Java-Quelle), scheint es, dass das Problem mit der mAttachInfo oder einem seiner Felder ist Null. shadowSize wurde früher überprüft und die Oberfläche wurde gerade erstellt. Gibt es einen Grund, warum die erste Ansicht keinen "mAttachInfo" -Wert hätte (angenommen, es bedeutet, dass sie nicht an einem Fenster hängt)? Oder es ist möglich, dass es sich um eine andere Zeile im try-Block handelt (die Ausnahme wird gefangen).

+0

Fehler bei RemoteLauncher.java:650 sein können. Was ist spezifisch in dieser Zeile? – Nizam

+0

Das wäre der Aufruf von startDrag im obigen Code: DragShadowBuilder shadowBuilder = new View.DragShadowBuilder (mView); – BJV

+0

dann ist 'mView' dort null. – Nizam

Antwort

0

Ansicht # startDrag wirft eine NPE, wenn die Ansicht nicht angehängt ist.

View # isAttachedToWindow kann Ihnen sagen, wenn die Sicht angebracht ist oder nicht, aber diese Methode ist nur auf KITKAT zur Verfügung.

Ich würde einen Fehler einreichen.

1

Ich stieß auch auf dieses Problem. Ich habe mich darum gekümmert, indem ich ein ImageView hinzugefügt habe, das ein Bild der Ansicht enthielt und es so verwendet habe, als hätte ich die ursprüngliche Ansicht gezogen und es funktioniert.

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

Dies könnte funktionieren, aber ich gab auf und wechselte von der Verwendung einer GridView zu linearen Listen. Seit ich es nicht mehr versuche/versuche, zögere ich, dir den "grünen Scheck" zu geben. Wenn jemand anderes das versucht und es funktioniert, lass es mich wissen und ich werde es überprüfen. – BJV

0

Ich weiß, das ist alt, aber ich lief genau in dieses Problem. In meinen benutzerdefinierten Adapter ich die Gegenstände Platz zu machen versuche, so war ich wie

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

Was für mich, etwas zu tun gearbeitet ist

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