11

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

我还在地图上启用了“MyLocationButton”,但由于地图覆盖了屏幕的整个高度,所以按钮被操作栏覆盖。

在此处输入图像描述

如何让地图片段在操作栏下方或屏幕底部绘制位置按钮?

4

5 回答 5

6

无需创建自己的按钮,只需根据操作栏大小移动内置按钮。
这段代码对我有用,按钮就是按钮应该在的位置(就像在谷歌地图中一样):

// 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,但它也适用于常规操作栏,只需进行一些修改..

于 2013-04-01T08:28:40.983 回答
3

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

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

从 API 文档:

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

另请参阅有关填充如何在 GoogleMap 中工作的描述

于 2013-12-05T21:14:48.920 回答
3

下面(尤其是在 中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);
}
于 2013-06-18T01:25:15.153 回答
1

这已作为增强功能提交(如果您还没有,请加注星标)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 之前做出决定)

于 2013-01-17T10:24:49.760 回答
0

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

根据您尝试实现的效果,将此值应用为边距或填充。我猜是因为半透明的 ActionBar,你会想尝试填充,以便仍然让地图出现在它后面(并保持透明效果)。我只是不能 100% 确定填充是否真的会将“定位我”按钮向下移动......如果不是,那么可能应用边距是您唯一的其他选择。

有关此属性的示例和更多详细信息,请参见此处。

于 2013-01-13T00:41:20.507 回答