【问题标题】:Exception when referencing MapView in a fragment - OSMdroid在片段中引用 MapView 时出现异常 - OSMdroid
【发布时间】:2017-12-07 14:30:21
【问题描述】:

我已经使用活动编写了一个带有 OSMdroid 的应用程序,但我现在正试图将其移植到片段中(不过我是片段的新手)。我收到错误消息: “java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void org.osmdroid.views.MapView.setBuiltInZoomControls(boolean)'”

MapView 好像还没有初始化,是不是我初始化的地方不对(OnCreateView)?根据活动生命周期,OnCreate 是在 OnCreateView 之前调用的,所以它不被识别是有道理的,但我很困惑然后将我的代码放在哪里。

我的片段实现代码:

 //inflating fragment layout
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_map, container, false);
        map = (MapView) view.findViewById(R.id.map);
        return view;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getActivity();
        Configuration.getInstance().load(context, PreferenceManager.getDefaultSharedPreferences(context));

        setupMap();
    }

//initializing map
    private void setupMap() {
        //adding zoom and touch controls
        map.setBuiltInZoomControls(true);
        map.setMultiTouchControls(true);

        //getting current location using coarse/fine location so we can set centerpoint
        currentLocation = getCurrentLocation();

... code continues ...

错误堆栈跟踪:

 java.lang.NullPointerException: Attempt to invoke virtual method 'void org.osmdroid.views.MapView.setBuiltInZoomControls(boolean)' on a null object reference
                                                                               at skicompanion.skicompanion.MapFragment.setupMap(MapFragment.java:101)
                                                                               at skicompanion.skicompanion.MapFragment.onCreate(MapFragment.java:86)
                                                                               at android.app.Fragment.performCreate(Fragment.java:2214)
                                                                               at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
                                                                               at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1153)
                                                                               at android.app.BackStackRecord.run(BackStackRecord.java:800)
                                                                               at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1562)
                                                                               at android.app.FragmentManagerImpl$1.run(FragmentManager.java:487)
                                                                               at android.os.Handler.handleCallback(Handler.java:815)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                               at android.os.Looper.loop(Looper.java:207)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5765)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

【问题讨论】:

  • 您好,请您添加堆栈跟踪。在 OnCreate 方法中调用 getActivity 也是危险的。此时,片段可能未附加到活动。然后导致 getActivity() = null。最好在 onActivityCreated() 中执行此操作。
  • 当然,我刚刚在上面添加了它。那么我应该添加我所有的地图实现,而不是 onActivityCreated() 吗?这是有道理的,因为它是在生命周期中的 onCreate 之后
  • 初始化 onCreateView 中的视图元素和 onActivityCreated 中基于上下文的调用。

标签: java android android-fragments android-mapview osmdroid


【解决方案1】:

在您发布的代码中,您似乎不需要重写 onCreate 方法。只需移动此代码:

    context = getActivity();
    Configuration.getInstance().load(context, PreferenceManager.getDefaultSharedPreferences(context));

    setupMap();

在返回调用之前进入onCreateView方法应该没问题。

【讨论】:

  • 谢谢 donfuxx,它奏效了——看来我需要了解更多关于片段的信息才能理解为什么.. MapView 网格与叠加层一起存在,甚至显示了我当前的位置。但是地图本身并没有显示它只是一个网格。知道为什么吗?
  • 可能是网速太慢了 ;-) ...或者该位置不在某个地方,请尝试缩小地图。此外,为了定位当前位置,您需要在清单中添加一些权限
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多