Невозможно отобразить MapView на фрагментах - PullRequest
0 голосов
/ 07 мая 2020

Я получаю сообщение об ошибке, как указано ниже:

java .lang.NullPointerException: попытка вызвать виртуальный метод void com.google. android .gms.maps.MapView. onCreate (android .os.Bundle) 'для ссылки на нулевой объект

Пожалуйста, помогите мне решить эту проблему и сообщите, где я ошибаюсь. Пожалуйста, найдите полный снимок ошибки под кодом.

    public class FragmentFriends extends Fragment implements OnMapReadyCallback {

    public static final String MAPVIEW_BUNDLE_KEY = "MAPVIEW_BUNDLE_KEY";
    private GoogleMap googleMap;
    @BindView(R.id.mapView)
    MapView mapView;
    private View viewFriends;

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

        // Inflate the layout for this fragment
        return viewFriends;
    }

    private void initGoogleMaps(Bundle savedInstanceState) {
        Bundle mapViewBundle = null;
        if (savedInstanceState != null) {
            mapViewBundle = savedInstanceState.getBundle(MAPVIEW_BUNDLE_KEY);
        }
        mapView.onCreate(mapViewBundle);
        mapView.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap map) {
        googleMap = map;
        googleMap.setMyLocationEnabled(true);
    }

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

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

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

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

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

    @Override
    public void onLowMemory() {
        mapView.onLowMemory();
        super.onLowMemory();
    }
}

Скриншот ошибки

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.MapView.onCreate(android.os.Bundle)' on a null object reference
        at com.bhagatsoftinc.trackio.fragments.FragmentFriends.initGoogleMaps(FragmentFriends.java:43)
        at com.bhagatsoftinc.trackio.fragments.FragmentFriends.onCreateView(FragmentFriends.java:31)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManagerImpl.java:1696)
        at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:299)
        at androidx.fragment.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:235)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
        at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:669)
        at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:631)
        at androidx.viewpager.widget.ViewPager.setCurrentItem(ViewPager.java:612)
        at com.google.android.material.tabs.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:3326)
        at com.google.android.material.tabs.TabLayout.dispatchTabSelected(TabLayout.java:1767)
        at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1760)
        at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1720)
        at com.google.android.material.tabs.TabLayout$Tab.select(TabLayout.java:2138)
        at com.google.android.material.tabs.TabLayout$TabView.performClick(TabLayout.java:2326)
        at android.view.View.performClickInternal(View.java:7839)
        at android.view.View.access$3600(View.java:886)
        at android.view.View$PerformClick.run(View.java:29363)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7814)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Добавьте эту функцию в свой код, чтобы ответить:

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

    Bundle mapViewBundle = outState.getBundle(MAPVIEW_BUNDLE_KEY);
    if (mapViewBundle == null) {
        mapViewBundle = new Bundle();
        outState.putBundle(MAPVIEW_BUNDLE_KEY, mapViewBundle);
    }

    mMapView.onSaveInstanceState(mapViewBundle);
}
0 голосов
/ 08 мая 2020

Переместите initGoogleMaps(savedInstanceState); в onViewCreated.

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

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Bundle mapBundle = savedInstanceState.getBundle(MAPVIEW_BUNDLE_KEY);
    if (mapBundle == null) {
        mapBundle = new Bundle();
    }
    initGoogleMaps(mapBundle);
}

private void initGoogleMaps(Bundle mapBundle) {
    mapView.onCreate(mapBundle);
    mapView.getMapAsync(this);
}

Если посмотреть на документацию, onSaveInstanceState() действительно отсутствовал:

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

    Bundle mapViewBundle = outState.getBundle(MAPVIEW_BUNDLE_KEY);
    if (mapViewBundle != null) {
        outState.putBundle(MAPVIEW_BUNDLE_KEY, mapViewBundle);
        mMapView.onSaveInstanceState(mapViewBundle);
    }

}

Однако mapView.onCreate(bundle) ожидает не допускающего значения NULL Bundle и, следовательно, вышеупомянутое было обновлено, чтобы передать Bundle, не допускающий значения NULL, для инициализации карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...