2015-11-17 3 views
2

У меня есть карта offline mapBox, но карта не загружается, потому что она равна нулю. Я следовал указаниям сайта: https://www.mapbox.com/android-sdk/MapFragment getMap() return null (mapBox)

В макете

<com.mapbox.mapboxsdk.views.MapView 
    android:id="@+id/mapView" 
    android:layout_width="fill_parent" 
    android:layout_height="400dp" 
    android:layout_marginTop="30dp" 
    android:layout_marginLeft="50dp" 
    android:layout_marginRight="50dp" 
    mapbox:access_token="@string/access_token" 
     /> 

В Fragment:

import com.mapbox.mapboxsdk.MapFragment; 
........ 

public class ConctactsFragment extends MapFragment { 
......... 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 


    getActivity(); 

    mRootView = inflater.inflate(R.layout.fragment_map, container, false); 
    mMapView =(MapView)mRootView.findViewById(R.id.mapView); 

    XmlPullParser parser=getResources().getXml(R.xml.attrs); 
    AttributeSet attrs = Xml.asAttributeSet(parser); 
    mMapView = new MapView(mContext, attrs); 

    Log.d(TAG, "The mapView in onCreateView: " + this.getMap()); 
    //The mapView in onCreateView: null 

    mMapView.setStyleUrl(Style.MAPBOX_STREETS); 

    mMapView.setCenterCoordinate(new LatLng(40.956645, 14.304816)); 
    mMapView.setZoomLevel(11); 

    return mRootView; 
} 

@Override 
public void onStart() { 

Log.d(TAG, "The mapView in OnStart: " +this.getMap()); 
// The mapView in OnStart: null 
    super.onStart(); 
    mMapView.onStart(); 
} 


} 

Ошибка является:

java.lang.NullPointerException 
at com.mapbox.mapboxsdk.MapFragment.onStart(MapFragment.java:70) 
+1

но в 'OnStart (...) mMapView = null' лучше делать в' onResume(); '' mMapView.onStart(); ' –

+0

Он называется onStart() раньше. Ошибка приложения в onStart() –

+0

Как определяется метод getMap()? Он установлен? – Christopher

ответ

3

Почему вы простирающийся MapFragment и определяет ваш собственный макет? В любом случае это выглядит так: R.id.mapView в вашем R.layout.fragment_map. Невозможно сказать больше без полной компоновки и логики загрузки фрагментов.

Вот код, который работает (с использованием MapBox SDK 2.2, Android SDK 23):

MainActivity класс:

import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

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

     // Load the fragment dynamically 
     getFragmentManager() 
       .beginTransaction() 
       .add(R.id.fragment_container_layout, MyMapFragment.create()) 
       .commit(); 
    } 

} 

Пользовательские фрагмент:

import android.app.Fragment; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.mapbox.mapboxsdk.constants.Style; 
import com.mapbox.mapboxsdk.geometry.LatLng; 
import com.mapbox.mapboxsdk.views.MapView; 

public class MyMapFragment extends Fragment { 
    private MapView mMapView; 

    public static MyMapFragment create() { 
     return new MyMapFragment(); 
    } 

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

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.my_map_fragment, container, false); 

     mMapView = (MapView) rootView.findViewById(R.id.mb_map_view); 

     mMapView.setStyleUrl(Style.MAPBOX_STREETS); 
     mMapView.setCenterCoordinate(new LatLng(40.956645, 14.304816)); 
     mMapView.setZoomLevel(11); 
     mMapView.onCreate(savedInstanceState); // If this line is omitted there is a native crash in the MapBox library 

     return rootView; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     mMapView.onStart(); 
    } 

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

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     mMapView.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     mMapView.onPause(); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     mMapView.onStop(); 
    } 

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

activity_main.xml (макет для главной деятельность):

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    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"> 

    <FrameLayout 
     android:id="@+id/fragment_container_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</FrameLayout> 

my_map_fragment.xml (макет для фрагмента пользовательских карт):

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:custom="http://schemas.android.com/apk/res-auto" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

    <com.mapbox.mapboxsdk.views.MapView 
     android:id="@+id/mb_map_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     custom:access_token="@string/mb_token"/> 
</FrameLayout> 
+0

Большое спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^