ViewPager 不在超过 1 个片段中显示地图 v2

Posted

技术标签:

【中文标题】ViewPager 不在超过 1 个片段中显示地图 v2【英文标题】:ViewPager doesnt show map v2 in more than 1 Fragment 【发布时间】:2013-12-27 17:03:41 【问题描述】:

我在视图寻呼机的片段中显示地图,带有详细片段,对于我动态创建片段的地图。我正在使用单个活动,因此每个屏幕都由一个片段表示。 NewsDetailsFragment 包含一个 ViewPager(地图)。

当我最初导航到 NewsDetailsFragment 时,地图已加载,现在如果我在滚动寻呼机上加载 NewsDetailsFragment 的新实例,我将显示我的下一条记录。第二个 NewsDetailsFragment 中的 ViewPager 不会显示地图。在 LogCat 中,Log 显示一切正常,地图正在显示并且标记已设置。但是在地图显示黑屏的地方。

如果有 1 个加载的地图 ViewPager,只有当我按下 Back 直到没有 NewsDetailsFragment (因此没有 ViewPagers 运行)时,再有 NewsDetailsFragment 才会显示他们的地图,只有当我打开 NewsDetailsFragment 的新实例时,它才会加载地图。

请解决我的问题。

【问题讨论】:

这是一个已知问题,请查看此链接。 ***.com/questions/14419521/… 我有同样的问题,看看这个链接。这解决了问题。 github.com/jfeinstein10/SlidingMenu/issues/… 假设,我有 4 个片段。在第 2 个和第 3 个片段上,我正在显示地图,而在剩下的两个片段上,不显示地图。Senerio 是:当我从第一个片段滚动到第 2 个片段时,那时地图的地方,显示黑屏。再一次,我从第 2 个滚动到第 1 个,从第 1 个滚动到第 2 个,地图正在显示。 嗨 osayilgan,我在您提到的链接中看到了解决方案。但对我没用,显示同样的问题:( FragmentTransaction 或 view pager 中是否有任何设置? 【参考方案1】:
import com.google.android.gms.maps.SupportMapFragment;

SupportMapFragment mMapFragment = SupportMapFragment.newInstance();     
FragmentManager fm = fragment.getChildFragmentManager();
fm.beginTransaction().add(R.id.map, mMapFragment).commit();
mMapFragment.getMapAsync(this);

@Override
public void onMapReady(GoogleMap googleMap) 
mGoogleMap = googleMap;

if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
    // TODO: Consider calling
    //    ActivityCompat#requestPermissions
    // here to request the missing permissions, and then overriding
    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
    //                                          int[] grantResults)
    // to handle the case where the user grants the permission. See the documentation
    // for ActivityCompat#requestPermissions for more details.
    return;

mGoogleMap.setMyLocationEnabled(true);

buildGoogleApiClient();

mGoogleApiClient.connect();


protected synchronized void buildGoogleApiClient() 

mGoogleApiClient = new GoogleApiClient.Builder(getContext())
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .addApi(LocationServices.API)
        .build();


@Override
public void onConnected(Bundle bundle) 

if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
    // TODO: Consider calling
    //    ActivityCompat#requestPermissions
    // here to request the missing permissions, and then overriding
    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
    //                                          int[] grantResults)
    // to handle the case where the user grants the permission. See the documentation
    // for ActivityCompat#requestPermissions for more details.
    return;

Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
        mGoogleApiClient);
if (mLastLocation != null) 
    //place marker at current position
    mGoogleMap.clear();
    //setLocation(mLastLocation.getLatitude(), mLastLocation.getLongitude());



mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(50000); //50 seconds
mLocationRequest.setFastestInterval(30000); //30 seconds
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
//mLocationRequest.setSmallestDisplacement(0.1F); //1/10 meter

 LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);


@Override
public void onConnectionSuspended(int i) 
Toast.makeText(customAdapter.getContext(), "onConnectionSuspended", Toast.LENGTH_SHORT).show();


@Override
public void onConnectionFailed(ConnectionResult connectionResult) 
Toast.makeText(customAdapter.getContext(), "onConnectionFailed", Toast.LENGTH_SHORT).show();

@Override
public void onLocationChanged(Location location) 
sourceLat = location.getLatitude();
sourceLng = location.getLongitude();
getRestaurantDetails();
latLng = new LatLng(location.getLatitude(), location.getLongitude());
//latLng = new LatLng(lat, lng);
//Log.wtf("Lat lng", lat + " " + lng);
mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 18));
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);

fragment 是 viewPagerFragment 的实例

在xml中

<LinearLayout
android:id="@+id/map"
android:layout_
android:layout_ />

【讨论】:

以上是关于ViewPager 不在超过 1 个片段中显示地图 v2的主要内容,如果未能解决你的问题,请参考以下文章

如何在 viewpager 中显示 2 个片段

带有标签和 Viewpager 的 Android 片段

在 Viewpager 上添加带有标记的 Google 地图

如何使用 TabLayout 在 ViewPager 中的 Google 地图片段中获取当前位置

Android ViewPager,片段中的cameraview未显示

ViewPager开关没有显示片段之间