2014-10-13 12 views
6

मेरे पास एक उपयोग केस है जहां एक सूची और नक्शा दृश्य एक ही कोड आधार साझा करते हैं और एक ही डेटा दिखाते हैं। इसलिए मैं उन्हें सूची के रूप में ListFragment और MapFragment का उपयोग करके अलग नहीं कर सकता।एक टुकड़े के अंदर एक नक्शा दृश्य कैसे बनाए रखें?

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:visibility="invisible"/> 

    <com.google.android.gms.maps.MapView 
     android:id="@+id/mapView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</RelativeLayout> 

उपयोगकर्ता सूची और नक्शे दृश्य के बीच टॉगल कर सकते हैं:

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

public class ListAndMapFragment extends Fragment { 

    private MapView mapView; 

    public ListAndMapFragment() {} 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle arguments) { 
     super.onCreateView(inflater, container, arguments); 
     View root = inflater.inflate(R.layout.fragment_pillar_list, container, false); 
     mapView = (MapView) root.findViewById(R.id.mapView); 

     if (arguments == null) { 
      mapView.onCreate(null); 
      MapsInitializer.initialize(this.getActivity()); 
     } 

     return root; 
    } 

    private GoogleMap getMap() { 
     return mapView.getMap(); 
    } 

    @Override 
    public void onResume() { 
     mapView.onResume(); 
     super.onResume(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mapView.onDestroy(); 
    } 

    @Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
     mapView.onLowMemory(); 
    } 
} 

कोई भी विचार कैसे इस समस्या का समाधान करने के लिए:

नीचे कोड Stripped? एक समाधान सभी मार्करों को प्रतिस्थापित करना होगा। हालांकि मैं जानना चाहता हूं कि कोई और दृष्टिकोण है या नहीं।

उत्तर

3

Marker ऑब्जेक्ट कॉन्फ़िगरेशन परिवर्तनों के माध्यम से नहीं रखा जा सकता है क्योंकि यह Parcelable या Serializable इंटरफ़ेस को लागू नहीं करता है।

हालांकि, आप MarkerOptions ऑब्जेक्ट को जारी रख सकते हैं क्योंकि यह Parcelable है और फिर अपने Marker से इसे फिर से बनाएं। आप अपने Marker रों से प्रत्येक के लिए प्रकार MarkerOptions के एक वर्ग के क्षेत्र में हो सकता है और उसके बाद विन्यास बदलाव नक्शे पर (उदाहरण के लिए onSaveInstanceState में) फिर से पॉप्युलेट:

mapView.getMap().addMarker(MyMarkerOptions); 

एक और तरीका है एक में अपने Marker रों को बचाने के लिए होगा हैश मैप और कॉन्फ़िगरेशन परिवर्तनों पर उनका पुनः उपयोग करें।

Here is another full example जो Parcelable LatLng अंक Markers पर बने रहने के लिए उपयोग करता है।

उदाहरण मार्कर जोड़ने के दौरान काम करता है, यह ArrayList को LatLng ऑब्जेक्ट के रूप में संबंधित निर्देशांक भी जोड़ता है। फिर कॉन्फ़िगरेशन परिवर्तन पर, ArrayList ऑब्जेक्ट onSaveInstanceState में सहेजा जाता है और LatLng ऑब्जेक्ट onCreate में पुनर्प्राप्त हो जाते हैं।


ओपी का नोट:

तो मैं onSaveInstanceState को लागू करने और ड्रॉप setRetainInstance(true) के समाधान के साथ चला गया। लाभ यह है कि मैं खुद को मानचित्र को बरकरार रख सकता हूं। हालांकि नुकसान यह है कि मानचित्र को प्रत्येक कॉन्फ़िगरेशन परिवर्तन पर पूरी तरह से प्रारंभ किया जाना चाहिए जिससे ऐप को 1 या 2 सेकंड के लिए धीमा कर दिया जाए। स्क्रीन को घुमाना। लेकिन मैं इसके साथ ठीक हूँ।

+1

मुझे लगता है कि मुझे setRetainInstance को हटाना है क्योंकि SaveInstanceState को नहीं कहा जाएगा? –

+0

यह सही है :) – nem035

+0

@artworkad シ अच्छा, मुझे खुशी है कि आप एक उपयुक्त समाधान खोजने में कामयाब रहे। यह समस्या वास्तव में बहुत अच्छी तरह से ज्ञात है और दुर्भाग्यवश यहां कोई समाधान नहीं है https:// दुर्भाग्यवश https://code.google.com/p/gmaps-api-issues/issues/detail?id=4650 समाधानों की विविधताओं के अलावा मैंने यहां सुझाया है। – nem035

संबंधित मुद्दे