隐藏在透明操作栏后面的MyLocationbutton,如何重新定位?

我已经将地图片段(API v2)添加到我的应用程序,地图覆盖整个屏幕,顶部有一个半透明的操作栏。 该活动使用android:windowActionBarOverlay设置为true的主题。

我也在地图上启用了“MyLocationButton”,但由于地图覆盖了屏幕的整个高度,因此button被操作栏覆盖。

在这里输入图像说明

我怎样才能让地图片段在操作栏下方或屏幕底部绘制位置button呢?

Solutions Collecting From Web of "隐藏在透明操作栏后面的MyLocationbutton,如何重新定位?"

而不是创build自己的button,只需根据操作栏大小移动内置button。
这段代码适用于我,button就是button应该在哪里(就像谷歌地图):

// 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,但它也可以用于常规操作栏,并进行一些修改。

下面(特别是在fixMapControlLocations )我已经用ActionBarSherlock解决了这个问题。

我遇到的问题是在狭窄的屏幕上,拆分操作栏有错误的偏移取决于旋转。 通过sherlock的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); } 

您可以使用最近添加的GoogleMap.setPadding()方法完成此操作:

 map.setPadding(leftPadding, topPadding, rightPadding, bottomPadding); 

从API文档:

此方法允许您在地图上定义可见区域,通过在地图的四个边缘的每一个上设置填充,可以向地图发出信号,以指示边缘周围的地图部分可能被遮挡。 地图function将适应填充。 例如,缩放控件,指南针,版权声明和Google徽标将移动到适合定义区域的内部,相机移动将相对于可见区域的中心等。

另请参阅填充在GoogleMap中的工作原理 。

这已经被提交作为一个增强(如果你还没有明星,请http://code.google.com/p/gmaps-api-issues/issues/detail?id=4670

作为一个临时解决方法,我已经添加了我自己的查找位置button下方的操作栏(我的地图片段是在一个RelativeLayout,所以我只是做了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来查找由地图API添加的button的ID。 它恰好是添加到地图的第二个视图(并设置为不可见)。

你当然可以用LayoutParams来调整这个button,而不是隐藏它,但是这个button只有在setMyLocationEnabled为true时才会出现! (在我的使用情况下,我更愿意让用户在启动GPS之前决定)

请确保使用?android:attr/actionBarSize (或?attr/actionBarSize如果您使用ActionBarSherlock)来正确地偏移片段的内容。

根据您要完成的效果,将这个值作为边距或填充。 我猜测,由于半透明ActionBar,你会想尝试填充,为了仍然有地图出现在它后面(并保持透视效果)。 我只是不是100%确定填充是否会实际移动“定位我”button…如果没有,那么可能应用保证金是唯一的select。

请参阅此处以获取有关此属性的更多详细信息。