我在我的应用程序中添加了一个地图片段(API v2),地图覆盖了整个屏幕,顶部有一个半透明的操作栏。该活动使用android:windowActionBarOverlay设置为 true 的主题。
我还在地图上启用了“MyLocationButton”,但由于地图覆盖了屏幕的整个高度,所以按钮被操作栏覆盖。
如何让地图片段在操作栏下方或屏幕底部绘制位置按钮?
我在我的应用程序中添加了一个地图片段(API v2),地图覆盖了整个屏幕,顶部有一个半透明的操作栏。该活动使用android:windowActionBarOverlay设置为 true 的主题。
我还在地图上启用了“MyLocationButton”,但由于地图覆盖了屏幕的整个高度,所以按钮被操作栏覆盖。
如何让地图片段在操作栏下方或屏幕底部绘制位置按钮?
无需创建自己的按钮,只需根据操作栏大小移动内置按钮。
这段代码对我有用,按钮就是按钮应该在的位置(就像在谷歌地图中一样):
// Gets the my location button
View myLocationButton = getSherlockActivity().findViewById(R.id.MainContainer).findViewById(2);
// Checks if we found the my location button
if (myLocationButton != null){
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
// Checks if the os version has actionbar in it or not
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
if (getSherlockActivity().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
// Before the action bar was added to the api
else if(getSherlockActivity().getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true)){
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
// Sets the margin of the button
ViewGroup.MarginLayoutParams marginParams = new ViewGroup.MarginLayoutParams(myLocationButton.getLayoutParams());
marginParams.setMargins(0, actionBarHeight + 20, 20, 0);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
myLocationButton.setLayoutParams(layoutParams);
}
只需将这段代码放在onActivityCreated中(如果你将它放在onCreateOptionsMenu中,它将不支持3.0之前的版本 - 因为生命周期不同。
另外,“R.id.MainContainer”是地图的容器片段。
我正在使用 ActionBar Sherlock,但它也适用于常规操作栏,只需进行一些修改..
您可以使用最近添加的GoogleMap.setPadding()方法完成此操作:
map.setPadding(leftPadding, topPadding, rightPadding, bottomPadding);
从 API 文档:
此方法允许您在地图上定义可见区域,通过在地图的四个边缘中的每一个上设置填充来向地图发出信号,表明边缘周围的地图部分可能会被遮挡。地图功能将适应填充。例如,缩放控件、指南针、版权声明和 Google 徽标将被移动以适应定义的区域,相机移动将相对于可见区域的中心等。
另请参阅有关填充如何在 GoogleMap 中工作的描述。
下面(尤其是在 中fixMapControlLocations
)我用 ActionBarSherlock 解决了这个问题。
我遇到的问题是在窄屏幕上,并且拆分操作栏的偏移量取决于旋转。通过夏洛克的isNarrow
检查让我知道它是否狭窄。
另一个关键变化是我正在设置 myLocation 的父视图的填充。这会获取内部的所有控件,并且基于 hierarchyviewer 是谷歌地图的操作方式。Google 归属标志位于 Surface 对象中树的下一个父级上。看起来不太容易移动,所以我可能最终会失去底部操作栏的透明度效果以保持合规性。
protected void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
super.onCreate(savedInstanceState);
setContentView(R.layout.map);
setUpMapIfNeeded();
getSupportActionBar().setBackgroundDrawable(d);
getSupportActionBar().setSplitBackgroundDrawable(d);
}
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the
// map.
if (map == null) {
// Try to obtain the map from the SupportMapFragment.
map = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map)).getExtendedMap();
// Check if we were successful in obtaining the map.
if (map != null) {
setUpMap();
}
}
}
private void setUpMap() {
fixMapControlLocations();
.....
}
private void fixMapControlLocations() {
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
{
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
View myLocationParent = ((View)mapFragment.getView().findViewById(1).getParent());
View myLocationParentParent = ((View)myLocationParent.getParent());
myLocationParentParent.setPadding(0, actionBarHeight, 0, isNarrow()?actionBarHeight:0);
}
public boolean isNarrow() {
return ResourcesCompat.getResources_getBoolean(getApplicationContext(),
R.bool.abs__split_action_bar_is_narrow);
}
这已作为增强功能提交(如果您还没有,请加注星标)http://code.google.com/p/gmaps-api-issues/issues/detail?id=4670
作为一种临时解决方法,我在操作栏下方添加了自己的查找位置按钮(我的地图片段位于相对布局中,所以我只是做了 alignParentRight 并设置了适当的边距顶部)。
然后在我的 onClickHandler 中我这样做了:
public void onClickHandler(View target) {
switch (target.getId()) {
case R.id.my_fml_btn:
mMap.setMyLocationEnabled(true);
View fmlBtn = mMapWrapper.findViewById(2); //mMapWrapper is my RelativeLayout
if (fmlBtn != null) fmlBtn.setVisibility(View.INVISIBLE);
break;
}
}
我使用 hierarchyviewer 来查找由 maps api 添加的按钮的 id。它恰好是添加到地图的第二个视图(并设置为不可见)。
您当然可以摆弄 LayoutParams 来偏移此按钮而不是隐藏它,但此按钮仅在您将 MyLocationEnabled 设置为 true 后才会出现!(在我的用例中,我更喜欢让用户在启动 gps 之前做出决定)
确保您使用?android:attr/actionBarSize
(或者?attr/actionBarSize
如果您正在使用 ActionBarSherlock)正确偏移片段的内容。
根据您尝试实现的效果,将此值应用为边距或填充。我猜是因为半透明的 ActionBar,你会想尝试填充,以便仍然让地图出现在它后面(并保持透明效果)。我只是不能 100% 确定填充是否真的会将“定位我”按钮向下移动......如果不是,那么可能应用边距是您唯一的其他选择。
有关此属性的示例和更多详细信息,请参见此处。