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).
Hata RemoteLauncher.java:650 altında olabilir olduğunu. Bu hatta özgü nedir? – Nizam
Bu, aşağıdaki kodda startDrag çağrısı olur: DragShadowBuilder shadowBuilder = new View.DragShadowBuilder (mview); – BJV
sonra 'mView' orada null. – Nizam