Android ViewPager 中的 MapFragment 不工作

Android MapFragment in ViewPager not working

我的英语不好。我想在 ViewPager 中使用 MapFragment,但我的代码不起作用。请帮帮我。

我的应用程序使用白色背景颜色,当 MapFragment 启动时,背景颜色变成灰色,等等。

我的fragment_map.xml

<com.google.android.gms.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:layout_marginBottom="?attr/actionBarSize" />

我的MapFragment.java

package com.lomovskiy.android.testapp.fragments;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.lomovskiy.android.testapp.R;
import com.lomovskiy.android.testapp.activities.MainActivity;

public class MapFragment extends Fragment implements OnMapReadyCallback {

private MapView mMapView = null;

private GoogleMap mGoogleMap = null;

public static MapFragment newInstance() {
    Bundle args = new Bundle();
    MapFragment fragment = new MapFragment();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MapsInitializer.initialize(MapFragment.this.getActivity().getBaseContext());
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View v = inflater.inflate(R.layout.fragment_map, container, false);
    mMapView = (MapView) v.findViewById(R.id.map_view);
    mMapView.onCreate(savedInstanceState);
    mMapView.getMapAsync(this);
    return v;
}

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

@Override
public void onMapReady(GoogleMap googleMap) {
    mGoogleMap = googleMap;
    mGoogleMap.addMarker(new MarkerOptions()
            .position(new LatLng(0, 0))
            .title("Marker")
            .draggable(true)
    );
}

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

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

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

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

}

我的AndroidManifest.xml

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

<permission
    android:name="com.arshad.map.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<application
    android:name=".Application"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity android:name=".activities.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".activities.TweetActivity" />
    <activity android:name=".activities.LoginActivity" />

    <meta-data
        android:name="io.fabric.ApiKey"
        android:value="is not null, i deleted this" />
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="is not null, i deleted this" />

</application>

</manifest>

您的 onCreateView() 方法应该像现在一样具有视图 inflation 代码,但是您应该将地图相关代码移至 onViewCreated(),即 运行片段实际上是完全构建的。

可能使用您当前的代码,mMapView = (MapView) v.findViewById(R.id.map_view) 实际上可能 return 为空。

所以你可以尝试这样的事情:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  super.onCreateView(inflater, container, savedInstanceState);
  View v = inflater.inflate(R.layout.fragment_map, container, false);
  return v;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
  super.onViewCreated(view, savedInstanceState);
  mMapView = (MapView) v.findViewById(R.id.map_view);
  mMapView.onCreate(savedInstanceState);
  mMapView.getMapAsync(this);
}