在DialogActivity中使用时,MapFragment会获得深色叠加

时间:2013-01-29 17:50:34

标签: android android-maps-v2

我正在尝试在MapFragment中使用Android Maps v2 API主题显示Activity @android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar。这很好用。但是,地图会出现黑暗叠加:

Dialog

当我将主题更改为@android:style/Theme.DeviceDefault.Light.NoActionBar时,地图会按原样显示:

Normal

这是我的xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/mapfragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        class="com.google.android.gms.maps.MapFragment" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="HELLO"
        android:textSize="@dimen/textsize_large" />

</LinearLayout>

这里发生了什么?

5 个答案:

答案 0 :(得分:19)

我遇到了同样的问题。经过一番研究,我发现了两个黑客:

  • 在styles.xml中为您的主题添加此参数:
    <item name="android:backgroundDimEnabled">false</item>

不良部分:删除活动背后的黑色叠加层。

  • 在地图对象的顶部设置z顺序:
    GoogleMapOptions googleMapsOptions = new GoogleMapOptions();
    googleMapsOptions.zOrderOnTop( true );
    MapFragment mapFragment = MapFragment.newInstance(googleMapsOptions);

错误部分:地图位于“缩放”控件和“我的位置”按钮上方。

Personnaly,我选择了第一个解决方案 希望这有帮助!

Link to the source

答案 1 :(得分:11)

DialogFragment

getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);

答案 2 :(得分:1)

要添加到Audrel's solution,可以在显示地图时动态取消对话框的窗口,并在地图消失时将其调暗(例如,当对话框有多个页面时,其中一个是地图):

private float mDimAmount;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    WindowManager.LayoutParams params = getWindow().getAttributes();
    mDimAmount = params.dimAmount; // remember original dim amount
    ...
}

private void undim() {
    WindowManager.LayoutParams params = getWindow().getAttributes();
    params.dimAmount = 0.0f;
    getWindow().setAttributes(params);
}

private void dim() {
    WindowManager.LayoutParams params = getWindow().getAttributes();
    params.dimAmount = mDimAmount;
    getWindow().setAttributes(params);
}

仍然只是另一种解决方法,而不是解决根本原因......

答案 3 :(得分:0)

根据您在对话框中对地图的用途,如果您不需要任何地图控件,则可以使用liteMode,其中只显示地图的图像你加载的位置。它没有z层重叠问题。

您可以将其添加到MapView布局xml:

map:liteMode="true"

这对我有用,因为我不希望我的地图无论如何都是互动的。

您可以在此处阅读Google文档:https://developers.google.com/maps/documentation/android-api/lite

答案 4 :(得分:0)

只需将此行添加到样式

即可
    <item name="android:backgroundDimEnabled">false</item>

这是我的风格:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/dark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="windowActionBar">false</item>
</style>