2013-08-16 16 views
7

GridView'ım var. GridView'deki öğelerin her biri bir Yatay (veya Dikey) Düzen'dir (yönlendirmeye bağlı olarak). Bu düzen içinde bir ImageView ve bir TextView.onLongPress'ten sonra, gridview'deki ilk görünüm startDrag'da NullPointerException alır

GridView'daki ilk görüntü dışındaki herhangi bir ImageView üzerinde "Long Touch" yaptığımda her şey planlandığı gibi çalışır. OnLongPress() işleyicisinde, ImageView üzerinde startDrag'ı ararım ve her şey planlandığı gibi çalışır. GridView'da ilk ImageView'da "Long Touch" yaparsam, Android View'un startDrag() yönteminde bir NullPointer istisnası olur. LocalState gibi bir ClipData bir DragShadowBuilder ve benim 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) 

Ben startDrag geçirilen ifade boş olmayan tüm olduklarını doğrulamak başardı. İşte o kod snippet'ine:

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

StartDrag false döndürür ve logcat sürükle mesaj ve istisna iz başlatılamıyor içerir.

Bu, yalnızca gridview'deki ilk ImageView'de gerçekleşir. Diğerleri gayet iyi çalışıyor.

Android View kaynağında bir ipucu aradım - aygıtım için derleme/etiket bulma deneme ve hata oldu ancak 16281 satırının startDrag'da olduğu birkaç taneden biri jb-mr1-release etiketi ile Nexus 10'um 4.2.1, bu yüzden doğru olanı olabilir). 16281 de kodudur:

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

Hattı 16281 denemede ilk ifadesi: IBinder belirteci = mAttachInfo.mSession ...

benim hafiyelik doğruysa (buna hakkım JB/Görünüm var. java kaynağı), sorunun mAttachInfo veya onun alanlarından birinin boş olduğu görünecektir. shadowSize daha önce vurguluyordu ve yüzey yeni oluşturuldu. İlk Görünümün bir "mAttachInfo" değerine sahip olmamasının bir nedeni var mı (bir pencereye bağlı olmadığı anlamına gelir)? Ya da try bloğu içinde başka bir satır olması mümkündür (istisna tutuluyor).

+0

Hata RemoteLauncher.java:650 altında olabilir olduğunu. Bu hatta özgü nedir? – Nizam

+0

Bu, aşağıdaki kodda startDrag çağrısı olur: DragShadowBuilder shadowBuilder = new View.DragShadowBuilder (mview); – BJV

+0

sonra 'mView' orada null. – Nizam

cevap

0

Görünüm # startDrag, Görünüm bağlı değilse bir NPE atar.

# isAttachedToWindow görünümü, görünümün eklenmiş olup olmadığını söyler ancak bu yöntem yalnızca KITKAT'da kullanılabilir.

Hata yapıyorum.

1

Bu sorunla da karşılaştım. Görünümün bir görüntüsünü içeren bir ImageView ekleyerek çalıştım ve orijinal görünümün sürüklendiği ve çalıştığını düşündüğüm gibi kullandım.

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

Bu işe yarayabilir, ancak ben vazgeçtim ve lineer listeleri kullanarak bir GridView kullanarak değiştirdim. Düzeltdiğim/denediğimden beri, sana "yeşil onay" vermekten çekiniyorum. Eğer başka biri bunu denerse ve işe yarıyorsa, haber verin ve kontrol edeyim. – BJV

0

Bu eski olduğunu biliyorum, ancak bu tam sorunla karşılaştım. Benim özel adaptör olarak Ben öğeler kare yapmaya çalışıyorum, bu yüzden benim için çalıştı Ne

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

gibi bir şey yaptığını

imageView.getLayoutParams().width = width; 
imageView.getLayoutParams().height = width; 
İlgili konular