2013-08-16 4 views
7

में NullPointerException प्राप्त होता है मेरे पास एक ग्रिड व्यू है। ग्रिड व्यू में से प्रत्येक आइटम एक क्षैतिज (या लंबवत) लेआउट है (अभिविन्यास के आधार पर)। उस लेआउट के अंदर एक छवि दृश्य और एक टेक्स्ट व्यू है।ऑन लोंगप्रेस के बाद, ग्रिडव्यू में पहली बार स्टार्ट ड्रग

जब मैं ग्रिड व्यू में पहले के अलावा किसी भी छवि दृश्य पर "लांग टच" करता हूं, तो सब कुछ योजनाबद्ध के रूप में कार्य करता है। ऑन लोंगप्रेस() हैंडलर में, मैं ImageView पर startDrag को कॉल करता हूं और सब कुछ योजनाबद्ध के रूप में काम करता है। यदि मैं ग्रिड व्यू में पहली छवि दृश्य पर "लांग टच" करता हूं, तो मुझे एंड्रॉइड व्यू की startDrag() विधि में एक NullPointer अपवाद मिलता है। एक ClipData, एक DragShadowBuilder, और LocalState के रूप में मेरे 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 के लिए पारित के थे गैर-शून्य में सक्षम था। यहाँ उस कोड स्निपेट है:

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

startDrag झूठी वापस आती है और logcat खींचें संदेश और अपवाद का पता लगाने शुरू करने में असमर्थ होता है।

यह केवल ग्रिडव्यू में पहली छवि दृश्य पर होता है। अन्य सभी ठीक काम करते हैं।

मैंने एंड्रॉइड व्यू स्रोत के चारों ओर एक सुराग ढूंढने के लिए प्रेरित किया - मेरे डिवाइस के लिए बिल्ड/टैग ढूंढना परीक्षण और त्रुटि थी, लेकिन मुझे पता चला कि लाइन 16281 लाइन में शुरू हुई थी, ड्रैग टैग जेबी-एमआर 1 रिलीज के साथ था (मेरा नेक्सस 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 कोशिश में पहली कथन है: IBinder टोकन = mAttachInfo.mSession ...

अगर मेरे sleuthing सही है (मैं सही जेबी/देखें है। जावा स्रोत), ऐसा लगता है कि यह मुद्दा mAttachInfo या उसके खेतों में से एक के साथ शून्य है। shadowSize पहले vetted था और सतह अभी बनाया गया था। क्या कोई कारण है कि पहले दृश्य में "mAttachInfo" मान नहीं होगा (मान लीजिए इसका मतलब है कि यह एक विंडो से जुड़ा नहीं है)? या यह संभव है कि यह कोशिश ब्लॉक के भीतर कुछ अन्य पंक्ति है (अपवाद पकड़ा जा रहा है)।

+0

त्रुटि RemoteLauncher.java:650 पर हो सकता है। उस रेखा पर क्या विशिष्ट है? – Nizam

+0

यह उपरोक्त कोड में शुरू करने के लिए कॉल होगा: DragShadowBuilder shadowBuilder = नया दृश्य।DragShadowBuilder (mView); – BJV

+0

फिर 'mView' शून्य है। – Nizam

उत्तर

0

देखें # दृश्य ड्रैग एक एनपीई फेंक देगा यदि दृश्य संलग्न नहीं है।

देखें # isAttachedToWindow आपको बता सकता है कि दृश्य संलग्न है या नहीं, लेकिन यह विधि केवल किटकैट पर उपलब्ध है।

मैं एक बग फाइल करूंगा।

1

मुझे भी इस समस्या का सामना करना पड़ा। मैंने एक छवि दृश्य जोड़कर इसके आसपास काम किया जिसमें दृश्य की एक छवि थी और इसका उपयोग किया गया क्योंकि मेरे पास मूल दृश्य खींचा जा रहा था और यह काम कर रहा है।

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

यह काम कर सकता है, लेकिन मैंने रैखिक सूचियों का उपयोग करने के लिए एक ग्रिड व्यू का उपयोग करके छोड़ दिया और स्विच किया। चूंकि मैं इसे ठीक करने/कोशिश कर रहा हूं, इसलिए मुझे आपको "हरी जांच" देने में संकोच नहीं है। अगर कोई और कोशिश करता है और यह काम करता है, तो मुझे बताएं और मैं इसे देख लूंगा। – BJV

0

मुझे पता है कि यह पुराना है, लेकिन मैं इस सटीक मुद्दे में भाग गया। अपने कस्टम अनुकूलक में मैं आइटम वर्ग बनाने के लिए कोशिश कर रहा था, तो मैं

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

क्या मेरे लिए काम किया जैसे कुछ कर रहा था

imageView.getLayoutParams().width = width; 
imageView.getLayoutParams().height = width; 
संबंधित मुद्दे