【问题标题】:google map fragment shows map container but no map display谷歌地图片段显示地图容器但没有地图显示
【发布时间】:2018-12-08 11:02:59
【问题描述】:

我在制作这个项目时关注了一个视频,但该视频是 3 年前的,正如预期的那样,依赖项已经过时,所以我更改了一些,没有发现错误。

应用程序运行顺利,但我打算使用的唯一功能却没有,那就是谷歌地图。

这是我的 gradle,以防万一,

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation files('libs/aapt2-3.2.1-4818971-windows.jar')
implementation 'com.android.support:design:28.0.0'
implementation 'com.google.android.gms:play-services-maps:16.0.0'

Android 清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.blogspot.skooltchdev.tabbedapplicationmaster">
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/MyMaterialTheme">

            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <meta-data
                android:name="com.google.android.geo.API_KEY"
                android:value=" My_API_KEY"/>
        </application>
        <uses-feature
            android:glEsVersion="0x00020000"
            android:required="true"/>
</manifest>

MainActivity.java

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;

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

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(false);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new FirstFragment(), "Map");
    adapter.addFragment(new SecondFragment(), "fragment two");
    adapter.addFragment(new ThirdFragment(), "fragment three");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}
}

FirstFragment.java

public class FirstFragment extends Fragment implements OnMapReadyCallback {

GoogleMap mGoogleMap;
MapView mMapView;
View mView;

public FirstFragment() {
    // Required empty public constructor
}

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


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

    mView = inflater.inflate(R.layout.first_fragment, container, false);
    return mView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    mMapView = (MapView) mView.findViewById(R.id.map);
    if(mMapView !=null){
        mMapView.onCreate(null);
        mMapView.onResume();
        mMapView.getMapAsync(this);
    }

}

@Override
public void onMapReady(GoogleMap googleMap) {
    MapsInitializer.initialize(getActivity());
    LatLng Home = new LatLng(10.263392,123.82489109999999);
    mGoogleMap = googleMap;
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    googleMap.addMarker(new MarkerOptions().position(Home).title("my home"));
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(Home));
}

}

first_fragment.xml

<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=".FirstFragment">

<com.google.android.gms.maps.MapView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/map">

</com.google.android.gms.maps.MapView>

</FrameLayout>

我已经尝试在谷歌云平台上启用计费(因为他们最近更改了很多东西),多次更改 api(在 console.dev...上),清理和重建。但它仍然显示没有标记和地图的谷歌地图(只是纯白色,底部没有谷歌,只是普通)。

【问题讨论】:

  • 你为什么使用MapView
  • 因为我按照教程使用它,我试图将它显示为片段,如您所见

标签: java android google-maps fragment


【解决方案1】:

试试这个 首先启动地图 在 mapview.oncreate 上不要发送 null

    MapsInitializer.initialize(this);
        mMapView = (MapView) mView.findViewById(R.id.map);
        if(mMapView !=null){
        mMapView.onCreate(savedInstanceState);

        mMapView.getMapAsync(this);
        }

        }

@Override
public void onMapReady(GoogleMap googleMap) {
        LatLng Home = new LatLng(10.263392,123.82489109999999);
        mGoogleMap = googleMap;
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        googleMap.addMarker(new MarkerOptions().position(Home).title("my home"));
        googleMap.animateCamera(CameraUpdateFactory.newLatLng(Home));
        }   


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

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

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

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mapView.onSaveInstanceState(outState);
}

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

建议 : 用 animateCamera 代替 moveCamera ,更好

【讨论】:

  • 我按照你说的做了,但它说它不能应用,当我 alt+enter 时,选择是引入局部变量/为“com.google ...”添加按需静态导入/调整代码样式设置/将类“MapsInitializer”注释为@Deprecated/创建 switch 语句。
  • 你指的是mapView,你指的是我的mMapView?
  • 顺便说一句,具有“MapsInitializer.initialize(this);”在我的 onViewCreated 上,参数带有红色下划线,表示无法应用 MapsInitializer,因此如果不先解决此问题,更改仍然无法工作:(
猜你喜欢
  • 2020-04-03
  • 2017-11-20
  • 2018-05-16
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多