2013-02-16 22 views
9

मुझे नक्शा नहीं मिल रहा है! मैं जो कुछ प्राप्त कर सकता हूं वह शून्य है।... fragment.getMap() शून्य शून्य देता है

यहां कोड है।

 public class MainActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     SupportMapFragment fragment = new SupportMapFragment(); 
     getSupportFragmentManager().beginTransaction() 
       .add(android.R.id.content, fragment).commit(); 


     GoogleMap map; 
     map = fragment.getMap(); 
      //here i cant access this snippet because map = null 
     if(map!=null){ 
     UiSettings mm = map.getUiSettings(); 
     map.setMyLocationEnabled(true); 
      } } 
      } 

प्रकट:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.anywhere_reminder" 
android:versionCode="1" 
android:versionName="1.0" > 

    <uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 
    <uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true"/> 

    <permission 
    android:name="com.example.anywhere_reminder.permission.MAPS_RECEIVE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name="com.example.anywhere_reminder.permission.MAPS_RECEIVE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"  /> 

    <application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity android:name="com.google.android.gms.BuildConfig" /> 
    <activity 
     android:name="com.example.anywhere_reminder.MainActivity" 
     android:label="@string/app_name" > 

     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     </activity> 

    <meta-data 
    android:name="com.google.android.maps.v2.API_KEY" 
    android:value=" my key "/> 

    </application> 
    </manifest> 
यहाँ

एक्सएमएल है:

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


<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/map" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
class="com.google.android.gms.maps.MapFragment"/> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:text="@string/hello_world" /> 

    </RelativeLayout> 

मैं इस समाधान Google Maps Android API v2 throws GooglePlayServicesNotAvailableException, out of date, SupportMapFragment.getMap() returns null की तरह इसे हल करने की कोशिश की .. लेकिन अभी भी काम नहीं किया

अद्यतन:

मैं अब काम कर मेरी नक्शा मिला .. यहाँ, संपादित काम कर संस्करण

public class MainActivity extends FragmentActivity { 
private GoogleMap myMap; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

      android.support.v4.app.FragmentManager myFragmentManager = getSupportFragmentManager(); 
      SupportMapFragment mySupportMapFragment 
      = (SupportMapFragment)myFragmentManager.findFragmentById(R.id.map); 


      myMap = mySupportMapFragment.getMap(); 
      if(myMap!=null) 
      myMap.setMyLocationEnabled(true); 


     } 
+0

अपने समाधान अद्यतन मेरे लिए काम मिल गया। +1 –

उत्तर

17

आप एक गतिशील टुकड़ा पैदा कर रहे है एक FragmentTransaction के माध्यम से। जब आप commit() पर कॉल करते हैं, तो टुकड़े को अभी तक स्क्रीन में जोड़ा गया है, क्योंकि FragmentTransaction केवल होने वाला है - यह अभी तक नहीं हुआ है। इसलिए, SupportMapFragment को अभी तक onCreateView() के साथ नहीं बुलाया गया है, इसलिए GoogleMap नहीं है।

या तो स्थिर टुकड़े (<fragment> टैग लेआउट में टैग) पर स्विच करें, या लेनदेन संसाधित होने तक GoogleMap के उपयोग में देरी करें।

+0

क्षमा करें: $ लेकिन मैं GoogleMap के उपयोग में देरी कैसे कर सकता हूं मैंने इसे रेज़्यूम() में कॉल करने का प्रयास किया और काम नहीं किया .. सुनिश्चित नहीं है कि आपका मतलब क्या है – proG

+0

@proG: 'प्रतिबद्ध() 'पर कॉल करने के बाद लेनदेन, कुछ 'व्यू' पर 'पोस्ट()' पर कॉल करें (या यदि आपके पास हैडलर' है)। जब तक आप 'रननेबल' शेड्यूल नहीं करते हैं, तब तक 'GoogleMap' मौजूद होना चाहिए। या फिर, स्थिर टुकड़ों पर स्विच करें। – CommonsWare

+0

@ कॉमोनवेयर मैं उनके बारे में पढ़ूंगा .. धन्यवाद – proG

6

फ्रैगमेंट मैनेजर क्लास में executePendingTransactions() इस देरी को ठीक करने के लिए डिज़ाइन किया गया था। डॉक्यूमेंटेंटियन से: फ्रैगमेंट ट्रान्सएक्शन के बाद FragmentTransaction.commit() के साथ प्रतिबद्ध है, इसे प्रक्रिया के मुख्य थ्रेड पर असीमित रूप से निष्पादित किया जाना निर्धारित है। यदि आप ऐसे लंबित परिचालनों को तत्काल निष्पादित करना चाहते हैं, तो आप ऐसा करने के लिए इस फ़ंक्शन को कॉल कर सकते हैं (केवल मुख्य थ्रेड से)। ध्यान दें कि सभी कॉलबैक और अन्य संबंधित व्यवहार इस कॉल के भीतर से किए जाएंगे, इसलिए सावधान रहें कि इसे कहां से बुलाया जाता है।

+4

'fragMan.executePendingTransactions()' को कॉल करने के बाद भी मुझे मानचित्र नहीं मिल सकता है, वही ** NullPointerException ** – Mani

+0

होता है मैंने 'executePendingTransactions' भी कोशिश की है और यह अभी भी कॉल करने के बाद शून्य है। –

1

इसे हल करने का एक और तरीका। GoogleMap निर्माण के लिए तैयार होने पर गतिविधि से संवाद करने के लिए MapFragment में एक इंटरफ़ेस लागू करें।

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 
    listener.onGoogleMapCreattion(); 


} 

तो फिर तुम सिर्फ activtiy में श्रोता लागू करने की आवश्यकता:

@Override 
public void onGoogleMapCreation() { 
    setUpMapIfNeeded(); 

} 

    private void setUpMapIfNeeded() { 
    // Do a null check to confirm that we have not already instantiated the map. 
    if (mMap == null) { 
     mMap = mMapFragment.getMap(); 
     // Check if we were successful in obtaining the map. 
     if (mMap != null) { 
      // The Map is verified. It is now safe to manipulate the map. 
      setUpMap(); 

     } 
    } 
    } 
+0

बेस्ट उत्तर। निर्माण प्रक्रिया की एसिंक प्रकृति को संभालना आईएमओ जाने का सही तरीका है। और कुछ और आपके अनुमान लगाते हुए कि अभी ऑब्जेक्ट तक पहुंचने का सही समय है। –

3

ले जाएँ कोड स्निपेट:

GoogleMap नक्शा; मानचित्र = fragment.getMap(); अगर (मानचित्र! = नल) {

UiSettings mm = map.getUiSettings(); 
map.setMyLocationEnabled(true); 

}

onResume को

() विधि, इससे आपकी समस्या का समाधान होगा

// यहां नक्शा अशक्त

नहीं है।

6

मैंने MapFragment क्लास को बढ़ाया है और श्रोता जोड़ा है। getMap के बारे में दस्तावेज़() कहते हैं:

... अगर खंड का दृश्य अभी तक तैयार नहीं है तो शून्य। यह तब हो सकता है, तो टुकड़ा lifecyle onCreateView (LayoutInflater, ViewGroup, बंडल) अब तक लागू नहीं किया है ....

तब मैं onCreateView के बाद श्रोता कहते हैं। मैं बुला गतिविधि या टुकड़ा में करने के बाद वर्ग

public class MySupportMapFragment extends SupportMapFragment{ 

private MySupportMapFragmentListener listener; 

public interface MySupportMapFragmentListener{ 
    public void onMapCreated(GoogleMap googleMap); 
} 

// value taken from source code 
private static final String MAP_OPTIONS = "MapOptions"; 

public static MySupportMapFragment newInstance() { 
     MySupportMapFragment f = new MySupportMapFragment(); 
     return f; 
} 

public static MySupportMapFragment newInstance(GoogleMapOptions options) { 
     MySupportMapFragment f = new MySupportMapFragment(); 
     Bundle args = new Bundle(); 
     args.putParcelable(MAP_OPTIONS, options); 
     f.setArguments(args); 
     return f; 
} 

// other newInstance methods ... 


/* (non-Javadoc) 
* @see android.support.v4.app.Fragment#onViewCreated(android.view.View, android.os.Bundle) 
*/ 
@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onViewCreated(view, savedInstanceState); 
    // here, as doc say, the map can be initialized, or the service is not available 
    if(listener!=null){ 
     listener.onMapCreated(getMap()); 
    } 

} 
/** 
* @return the listener 
*/ 
public MySupportMapFragmentListener getListener() { 
    return listener; 
} 
/** 
* @param listener the listener to set 
*/ 
public void setListener(MySupportMapFragmentListener listener) { 
    this.listener = listener; 
} 

}

जोड़ने ...

mapFragment = MySupportMapFragment.newInstance(); 
    mapFragment.setListener(new MySupportMapFragmentListener() { 
     @Override 
     public void onMapCreated(GoogleMap googleMap) { 
      // TODO Auto-generated method stub   
      if(googleMap!=null){ 
        // service is unaviable 
      }    
     } 
+0

बहुत अच्छा समाधान है, इस समय यह इष्टतम एक – user2302510

+0

प्रतीत होता है क्या आप इसके बजाय सीधे ViewCreated का उपयोग नहीं कर सकते? – Tiago

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