2013-01-22 13 views
7

मुझे एक फ्रैगमेंट के साथ समस्या है जो नए Google मानचित्र API से SuportMapFragment को एम्बेड करता है। जब मेरा टुकड़ा बनाया जाता है तो यह onResume विधि में AsyncTask में कुछ डेटा प्राप्त करता है। हालांकि ऐसा होता है कि MapFragment ऑफ-स्क्रीन बनी हुई है, इसके बजाय एक प्रगति पट्टी प्रदर्शित होती है।GoogleMap.animateCamera() पर GlobalLayout() पर क्रैश क्यों होता है?

जब AsyncTask पूरा हो गया है, तो मैं मानचित्र दृश्य के onGlobalLayout ईवेंट के साथ पंजीकरण करता हूं। फिर मैं टुकड़ा प्रदर्शित करता हूं, जिसके परिणामस्वरूप मानचित्र दृश्य दिखाया जाता है और लेआउट किया जाता है। onGlobalLayout ट्रिगर किया गया है और एनीमेशन शुरू होता है।

यह कुछ समय तक ठीक काम करता है, जब तक कि मैंने लगभग तुरंत पूरा करने के लिए AsyncTask डेटा एकत्र करने में संचालन को अनुकूलित करना शुरू नहीं किया। अब ऐप अक्सर शुरू होने पर दुर्घटनाग्रस्त हो जाएगा, अक्सर डीबग की तुलना में रिलीज में, यही कारण है कि मुझे लगता है कि मैं रेसिंग हालत से निपट रहा हूं कि मुझे पता नहीं है।

अपवाद पढ़ता है:

मानचित्र आकार नहीं होना चाहिए 0. सबसे अधिक संभावना, लेआउट अभी तक नक्शा दृश्य की हुई नहीं किया है।

किसी भी अंतर्दृष्टि की सराहना की जाती है।

संदर्भ के लिए:

// Hide status UI 
this.progressBar.setVisibility(View.INVISIBLE); 
this.statusTextView.setVisibility(View.INVISIBLE); 

// Update state 
this.uraDataDownloadFinished = true; 

// Schedule map translation to occur when layout is complete 
final View mapView = this.mapFragment.getView(); 
if (mapView.getViewTreeObserver().isAlive()) 
{ 
    mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
    { 
     @SuppressWarnings("deprecation") 
     @SuppressLint("NewApi") // We check which build version we are using. 
     @Override 
     public void onGlobalLayout() 
     { 
      Log.d(TAG, "onGlobalLayout()"); 
      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) 
      { 
       mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 
      else 
      { 
       mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } 

      // here we crash 
      this.map.animateCamera(
        CameraUpdateFactory.newLatLngBounds(
          LatLngBounds.builder() 
           .include(topLeft) 
           .include(topRight) 
           .include(bottomLeft) 
           .include(bottomRight) 
           .build(), 
          0), 
        durationMs, 
        null); 
     } 
    }); 
} 

// Show map (which will eventually trigger onGlobalLayout) 
this.getFragmentManager().beginTransaction().show(this.mapFragment).commit(); 
this.mapFragment.getMap().setOnCameraChangeListener(this); 

धन्यवाद एक बहुत: इस कोड है कि दुर्घटना का कारण लगता है!

उत्तर

5

मुझे यकीन नहीं है, लेकिन जैसा कि आप AsyncTask का उपयोग कर रहे हैं, शायद यह है कि आप मानचित्र के लेआउट से पहले मानचित्र सीमाएं प्राप्त करने का प्रयास कर रहे हैं।

आप documentation देख सकते हैं, यह newLatLngBounds(boundary, width, height, padding) का उपयोग करने के लिए सुझाव देता है।

+0

धन्यवाद, कि काम करता है। चूंकि नक्शा पूरी तरह से लेआउट कंटेनर भरता है, इसलिए मैं इसके आयामों का उपयोग कर सकता हूं। हालांकि, मेरा सवाल बनी हुई है। चूंकि मैं 'ग्लोबललायआउट()' की प्रतीक्षा कर रहा हूं, मुझे इस समस्या में भाग नहीं लेना चाहिए, क्या मुझे चाहिए? – Chris

+0

नहीं, मुझे ऐसा नहीं लगता है, आपको नक्शे तक ले जाने तक प्रतीक्षा करना होगा। – jgonza73

+0

... या नक्शा सीमाओं के बिना कैमराऑप्शन संपादित करें – jgonza73

3

इस एक कोशिश करें, यह मेरे लिए काम करता है:

map.setOnCameraChangeListener(new OnCameraChangeListener() { 

    @Override 
    public void onCameraChange(CameraPosition arg0) { 
     // Move camera. 
     map.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 10)); 
     // Remove listener to prevent position reset on camera move. 
     map.setOnCameraChangeListener(null); 
    } 
}); 
संबंधित मुद्दे