2011-10-19 12 views
11

मैं एक टुकड़ा में mapviews प्रयोग करने के लिए हैक के साथ एंड्रॉयड अनुकूलता वर्ग का उपयोग कर रहा मिली: https://github.com/petedoyle/android-support-v4-googlemapsटुकड़ों के साथ एंड्रॉइड मैपव्यू दो बार जोड़ा नहीं जा सकता है?

दुर्भाग्य से, मैं क्या लग रहा है कि अगर mapfragment गतिविधि से हटा दिया जाता है, और फिर readded, मैं मिलता है "आपको केवल नक्शा सक्रियता में एक नक्शा दृश्य देखने की अनुमति है" त्रुटि। "

मैं त्रुटि के पीछे सिद्धांत को समझता हूं, और विधि विधि पर खंडों में मानचित्रदृश्य को नष्ट करने का प्रयास करता हूं। दुर्भाग्य से मैं मानचित्रदृश्य को नष्ट नहीं कर सकता पूरी तरह से, क्योंकि मुझे अभी भी यह मिल रहा है। मेरा कोड इस तरह दिखता है:

private RelativeLayout layout; 
private MapView mp; 

public void onResume(){ 
    super.onResume(); 
    Bundle args = getArguments(); 
    if(mp == null) 
    { 
     mp = new MapView(getActivity(), this.getString(R.string.map_api_key)); 
     mp.setClickable(true); 
    } 

    String request = args.getString("requestId"); 
    layout = (RelativeLayout) getView().findViewById(R.id.mapholder); 
    layout.addView(mp); 
    //TextView txt = (TextView) getView().findViewById(R.id.arguments); 
    //txt.setText(request); 
} 

public void onPause(){ 
    super.onPause(); 
    layout.removeView(mp); 
    mp = null; 
} 

क्या किसी के पास इस बात पर कोई विचार है कि संदर्भ को मैं यहां नष्ट करने के लिए उपेक्षा कर रहा हूं?

उत्तर

15

मुझे एक ही समस्या का सामना करना पड़ा।

  • यह गतिविधि में MapView उसमें केवल एक ही होना चाहिए के रूप में, मैं इसे onCreate विधि में गतिविधि में प्रारंभ:

    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        // initialize MapView programmatically to be used in Fragment : 
        this.mActivityMapView = new MapView(MainActivity.this, getString(R.string.debug_mapview_apikey)); 
    
        setContentView(R.layout.activity_main); 
    } 
    
  • तब मैं उस में ठीक हो यहाँ कैसे मैं इसे हल है टुकड़ा onCreateView विधि:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        this.mMapView = ((MainActivity) getActivity()).getMapView(); 
        return this.mMapView; 
    } 
    
  • और मैं टुकड़ा OnDestroy विधि में इसे नष्ट:

    public void onDestroy() { 
        NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent(); 
        parentView.removeView(this.mMapView); 
        super.onDestroy(); 
    } 
    
6

आप backstack करने के लिए एक MapFragment जोड़ सकते हैं इस तरह से मानचित्र दृश्य को हटाने के लिए onPause विधि (बजाय OnDestroy विधि) में

public void onPause() { 
    NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent(); 
    parentView.removeView(this.mMapView); 
    super.onPause();} 

चाहते हो सकता है,। (FragmentTransaction.addToBackStack नष्ट किया जा रहा से एक टुकड़ा रोकता है)

6

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

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    this.mMapView = ((MyGameActivity) getActivity()).getMapView(); 
    if (this.mMapView.getParent()!=null) 
    { 
     NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent(); 
     parentView.removeView(this.mMapView); 
    } 
    return this.mMapView; 
} 
4

मैं इस समस्या का एक सरल उपाय प्राप्त करने की कोशिश: इसे ठीक करने के लिए, OnCreateView अंदर मैं निम्नलिखित किया था। मेरी दृश्य विवरण (एक सापेक्ष लयआउट एक्सटेंशन) को संभालने वाली कक्षा पर, मैंने private static MapView myMapView; घोषित किया।

फिर, ओवरराइड निम्नलिखित कोड का टुकड़ा की तरह onFinishInflate() विधि:

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 

    //myMapView = (MapView) findViewById(R.id.map_view); 
    if (myMapView==null) 
     myMapView = new MapView(context, getResources().getString(R.string.map_view_api_key)); 
    if (myMapView.getParent() != null) 
     ((ViewGroup)myMapView.getParent()).removeView(myMapView); 

    myMapView.setClickable(true); 
    myMapView.setEnabled(true); 
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    myMapView.setLayoutParams(lp);   
    this.addView(myMapView); 

} 

इस तरह आप MapView उसमें केवल एक ही है।

0

यहां बताया गया है कि मैंने इस मुद्दे को फ्रैगमेंट के मामले में कैसे हल किया।

लेआउट

<LinearLayout 
     android:id="@+id/ll_mapcontainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" /> 

बनाएं अपनी XML फ़ाइल में कहीं भी इस तरह लेआउट जगह है जहाँ आप नक्शे

अब कोड इस तरह हो जाएगा प्रदर्शित करना चाहते हैं कर सकते हैं।

package com.yuviii.sample; 

import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.yuviii.sample.R; 

/** 
* Created by yubraj Poudel on 12/20/15. 
*/ 
public class ContactUsFragment extends Fragment { 
    static final LatLng PRACTICAL_ANSWER_LOCATION = new LatLng(53.558, 9.927); 
    private SupportMapFragment fragment; 
    private GoogleMap map; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.page_contactus, container, false); 
     return v; 
    } 



    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
        initializeMap(); 
    } 

    private void initializeMap() { 

     FragmentManager fm = getChildFragmentManager(); 
     fragment = (SupportMapFragment) fm.findFragmentById(R.id.ll_mapcontainer); 
     if (fragment == null) { 
      fragment = SupportMapFragment.newInstance(); 
      fm.beginTransaction().replace(R.id.ll_mapcontainer, fragment).commit(); 
     } 

    } 
    @Override 
    public void onResume() { 
     super.onResume(); 
     if (map == null) { 
      map = fragment.getMap(); 
      map.addMarker(new MarkerOptions().position(PRACTICAL_ANSWER_LOCATION)); 
     } 
    } 
} 

यह मेरे लिए काम करता है। का आनंद लें !!!

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