我正在尝试将Google Maps Android API v2集成到我的Android应用程序中。我正在将Google地图置于布局中间。当布局能够适合屏幕时,它的效果很好,但是当布局太大而不适合,并且用户向下滚动以查看其余内容时,其余的布局会被Google Map涂黑。请参阅以下屏幕截图:
(注意:禁用所有地图手势以允许用户滚动。)
我的布局XML:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:fillViewport="true" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="20sp" >
<TextView
android:id="@+id/race_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="14sp"
android:textSize="@dimen/DetailsTop"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/race_in_chase" />
<TextView
android:id="@id/race_in_chase"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/in_the_chase"
android:textSize="@dimen/DetailsTop"
android:background="@drawable/inthechase"
android:paddingLeft="20sp"
android:paddingRight="20sp"
android:visibility="gone"
android:layout_alignParentRight="true" />
<TextView
android:id="@+id/race_name"
style="@style/RaceDetailsName"
android:layout_below="@id/race_num" />
<TextView
android:id="@+id/race_track"
style="@style/RaceDetailsText"
android:paddingBottom="20sp"
android:layout_below="@id/race_name" />
<TextView
android:id="@+id/race_time"
style="@style/RaceDetailsText"
android:layout_below="@id/race_track" />
<TextView
android:id="@+id/race_tv"
style="@style/RaceDetailsText"
android:layout_below="@id/race_time" />
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="380dp"
android:layout_marginTop="20sp"
android:layout_marginBottom="20sp"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_below="@id/race_tv" />
<TextView
android:id="@+id/race_track_size"
style="@style/RaceDetailsText"
android:layout_below="@id/map" />
</RelativeLayout>
</ScrollView>
我的活动中的地图设置:
private void setUpMapIfNeeded() {
if (mMap == null) {
mMap = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
if (mMap != null) {
setUpMap();
}
}
}
private static final LatLng CHICAGOLAND = new LatLng(41.474856, -88.056928);
private void setUpMap() {
mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
mMap.getUiSettings().setZoomControlsEnabled(false);
mMap.getUiSettings().setAllGesturesEnabled(false);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(CHICAGOLAND)
.zoom(14.5f)
.bearing(53)
.build();
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
我的预感是地图片段不像ScrollView,因为如果整个布局适合屏幕并且不需要滚动,那么布局就好了。地图本身似乎是正确的大小。停电是视图中其余项目的确切大小。有没有人有任何想法,我怎么能摆脱地图下面的停电,所以我可以看到它下面的TextView?我到目前为止所尝试过的一切都没有奏效。
答案 0 :(得分:2)
我能够通过黑客解决这个问题。我扩展了ScrollView,因此我可以收到关于滚动事件的通知。我使用了来自Synchronise ScrollView scroll positions - android的ObservableScrollView实现。
我添加到了onCreate():
ObservableScrollView sv = (ObservableScrollView) findViewById(R.id.scroll);
sv.setScrollViewListener(this);
然后,当我收到滚动更改事件时,我切换整个视图的可见性,这会强制重新布局,从而阻止黑盒出现。
public void onScrollChanged(ObservableScrollView sv, int x, int y, int oldx, int oldy) {
sv.setVisibility(View.GONE);
sv.setVisibility(View.VISIBLE);
}
我试图使地图视图无效,并切换地图视图的可见性,但都没有效果。值得庆幸的是,切换整个视图的可见性不会导致任何闪烁或其他奇怪的行为。
可能有一个更好的解决方案,但在这一点上,这是我发现的唯一可行的方法。
答案 1 :(得分:1)
通过覆盖FragmentPagerAdapter中的onPageScrolled
,我能够在Viewpager中针对同一问题调整上述内容:
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
if ((position == 0 && positionOffsetPixels > 0) ||
(position == 1 && positionOffsetPixels == 0)) {
MyFragment blackedOutFragment = (MyFragment) getSupportFragmentManager()
.findFragmentByTag("android:switcher:" + R.id.pager + ":1");
if (blackedOutFragment != null) {
blackedOutFragment.getView().setVisibility(View.GONE);
blackedOutFragment.getView().setVisibility(View.VISIBLE);
}
}
}
Viewpager中的位置0
是一个包含MapFragment的片段,位置1
是片段在滚动后变黑。
答案 2 :(得分:1)
我的解决方法:使用新的snapshot interface from GoogleMap并在滚动页面时显示地图的快照。
这是我设置快照的代码(它与map相同的片段,名为FragmentMap.java):
public void setSnapshot(int visibility) {
switch(visibility) {
case View.GONE:
if(mapFragment.getView().getVisibility() == View.VISIBLE) {
getMap().snapshot(new SnapshotReadyCallback() {
@Override
public void onSnapshotReady(Bitmap arg0) {
iv.setImageBitmap(arg0);
}
});
iv.setVisibility(View.VISIBLE);
mapFragment.getView().setVisibility(View.GONE);
}
break;
case View.VISIBLE:
if(mapFragment.getView().getVisibility() == View.GONE) {
mapFragment.getView().setVisibility(View.VISIBLE);
iv.setVisibility(View.GONE);
}
break;
}
}
“mapFragment”是我的SupportedMapFragment,“iv”是ImageView(make it match_parent)。
我在这里控制卷轴:
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(position == 0 && positionOffsetPixels > 0 || position == 1 && positionOffsetPixels > 0) {
((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.GONE);
} else if(position == 1 && positionOffsetPixels == 0) {
((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.VISIBLE);
}
}
@Override
public void onPageScrollStateChanged(int arg0) {}
@Override
public void onPageSelected(int arg0) {}
});
我的地图片段(FragmentMap)位于第1位,因此我需要控制从位置0到1以及从位置1到2(第一个if子句)的滚动。 “getRegisteredFragment()”是我的自定义FragmentPagerAdapter中的一个函数,其中我有一个名为“registeredFragments”的SparseArray(Fragment)。
因此,无论何时滚动到地图或从地图滚动,您都会看到它的快照。这对我很有用。
答案 3 :(得分:0)
我的猜测是在Activity初始化期间MapFragment的高度为0。试试
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="20sp" >
....
<TextView
android:id="@+id/race_track_size"
style="@style/RaceDetailsText"
android:layout_alignParentBottom="true"
android:layout_marginBottom="2dp"/>
</RelativeLayout>
答案 4 :(得分:0)
只是一个实验,但您是否尝试在Map初始化之后以编程方式在setupMap()中将TextView添加到屏幕上?
// First, get a handle on the parent RelativeLayout,
// call it parentRelativeLayout, then…
TextView textView = new TextView(getActivity());
RelativeLayout.LayoutParams textLayout = new RelativeLayout.LayoutParams(
RelativeLayout.MATCH_PARENT,
RelativeLayout.MATCH_PARENT
);
textLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, -1);
textView.setLayoutParams(textLayout);
parentRelativeLayout.addView(textView)
答案 5 :(得分:0)
这应该通过使表面视图透明来解决它
答案 6 :(得分:0)
另一种可能性是使用新的GoogleMap.snapshot()函数并使用地图的屏幕截图,而不是here所述。
答案 7 :(得分:0)