代码之家  ›  专栏  ›  技术社区  ›  Benjamin Gakami

如何在fragment中成功实现android mapbox android sdk

  •  1
  • Benjamin Gakami  · 技术社区  · 7 年前

    我在一个带有底部导航的片段中使用mapbox,当我退出并恢复应用程序或快速更改选项卡时,应用程序崩溃。这就是我得到的错误

    10-07 22:20:36.046 21867-21886/com.dropexpress.driver.dropexpressdriver E/Mbgl-FileSource: Failed to read the storage key: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Bundle.getBoolean(java.lang.String, boolean)' on a null object reference at com.mapbox.mapboxsdk.storage.FileSource.getCachePath(FileSource.java:88) at com.mapbox.mapboxsdk.storage.FileSource$FileDirsPathsTask.doInBackground(FileSource.java:165) at com.mapbox.mapboxsdk.storage.FileSource$FileDirsPathsTask.doInBackground(FileSource.java:155) at android.os.AsyncTask$2.call(AsyncTask.java:304) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) 下面的代码总是失败,当我退出应用程序并继续,或当我改变标签迅速,我使用底部导航。

    复制步骤

    1. 这是我的片段代码

      package com.dropexpress.driver.dropexpressdriver.fragments;
      import android.content.Context;
      import android.net.Uri;
      import android.os.Bundle;
      import android.support.v4.app.Fragment;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;
      import android.widget.TextView;
      import com.dropexpress.driver.dropexpressdriver.R;
      import com.mapbox.mapboxsdk.Mapbox;
      import com.mapbox.mapboxsdk.maps.MapView;
          public class HomeFragment extends Fragment {
          private MapView mapView;
          private static final String ARG_PARAM1 = "param1";
          private static final String ARG_PARAM2 = "param2";
      
          private String mParam1;
          private String mParam2;
      
          private OnFragmentInteractionListener mListener;
      
          public HomeFragment() {
              // Required empty public constructor
          }
      
          /**
           * Use this factory method to create a new instance of
           * this fragment using the provided parameters.
           *
           * @param param1 Parameter 1.
           * @param param2 Parameter 2.
           * @return A new instance of fragment HomeFragment.
           */
          // TODO: Rename and change types and number of parameters
          public static HomeFragment newInstance(String param1, String param2) {
              HomeFragment fragment = new HomeFragment();
              Bundle args = new Bundle();
              args.putString(ARG_PARAM1, param1);
              args.putString(ARG_PARAM2, param2);
              fragment.setArguments(args);
              return fragment;
          }
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              if (getArguments() != null) {
                  mParam1 = getArguments().getString(ARG_PARAM1);
                  mParam2 = getArguments().getString(ARG_PARAM2);
              }
          }
      
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                   Bundle savedInstanceState) {
              // Inflate the layout for this fragment
      
              View view = inflater.inflate(R.layout.fragment_home, container, false);
              Mapbox.getInstance(requireActivity(), "pk.eyJ1Ijoic3ludGF4bHRkIiwiYSI6ImNqaDJxNnhzbDAwNnMyeHF3dGlqODZsYjcifQ.pcz6BWpzCHeZ6hQg4AH9ww");
              mapView = (MapView) view.findViewById(R.id.mapView);
              mapView.onCreate(savedInstanceState);
      
              return  view;
          }
      
          // TODO: Rename method, update argument and hook method into UI event
          public void onButtonPressed(Uri uri) {
              if (mListener != null) {
                  mListener.onFragmentInteraction(uri);
              }
          }
      
          @Override
          public void onAttach(Context context) {
              super.onAttach(context);
              if (context instanceof OnFragmentInteractionListener) {
                  mListener = (OnFragmentInteractionListener) context;
              } else {
                  throw new RuntimeException(context.toString()
                          + " must implement OnFragmentInteractionListener");
              }
          }
      
          @Override
          public void onDetach() {
              super.onDetach();
              mListener = null;
          }
      
          /**
           * This interface must be implemented by activities that contain this
           * fragment to allow an interaction in this fragment to be communicated
           * to the activity and potentially other fragments contained in that
           * activity.
           * <p>
           * See the Android Training lesson <a href=
           * "http://developer.android.com/training/basics/fragments/communicating.html"
           * >Communicating with Other Fragments</a> for more information.
           */
          public interface OnFragmentInteractionListener {
              // TODO: Update argument type and name
              void onFragmentInteraction(Uri uri);
          }
          @Override
          public void onResume() {
              super.onResume();
              mapView.onResume();
          }
      
          @Override
          public void onPause() {
              super.onPause();
              mapView.onPause();
          }
      
          @Override
          public void onStop() {
              super.onStop();
              mapView.onStop();
          }
      
          @Override
          public void onLowMemory() {
              super.onLowMemory();
              mapView.onLowMemory();
          }
      
          @Override
          public void onSaveInstanceState(Bundle outState) {
              super.onSaveInstanceState(outState);
              mapView.onSaveInstanceState(outState);
          }
      
      }
      

    Android版本: 5.0 + 摩托罗拉g5 6.5.0

    2 回复  |  直到 7 年前
        1
  •  1
  •   Hashir Saeed    7 年前

    在展开布局之前,先放置Mapbox.getInstance。

      Mapbox.getInstance(requireActivity(),"Your Map Key");
      View view = inflater.inflate(R.layout.fragment_home, container, false);
      mapView = (MapView) view.findViewById(R.id.mapView);
      mapView.onCreate(savedInstanceState);
    

    我希望这对你有帮助。

        2
  •  1
  •   Benjamin Gakami    7 年前

    https://github.com/mapbox/mapbox-gl-native/issues/13044#issuecomment-427861016

    他们的回答是:

    我可以看到提供的代码有两个问题:

    MapView#onDestroy ,这必须从你的碎片中调用 #onDestroyView MapView#onCreate 应该从片段的 #onViewCreated 而不是 #onCreateView .