Подтвердить что ты не робот

MapFragment получает темное наложение при использовании в DialogActivity

Я пытаюсь показать 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>

Что здесь происходит?

4b9b3361

Ответ 1

У меня такая же проблема. После некоторых исследований я обнаружил два хака:

  • Добавьте этот параметр для своей темы в styles.xml:
    <item name="android:backgroundDimEnabled">false</item>

Плохая часть: удаляет черные надписи за активностью.

  • Задайте порядок z в верхней части для объекта карты:
    GoogleMapOptions googleMapsOptions = new GoogleMapOptions();
    googleMapsOptions.zOrderOnTop( true );
    MapFragment mapFragment = MapFragment.newInstance(googleMapsOptions);

Плохая часть: карта находится над кнопкой Zoom и кнопкой MyLocation.

Personnaly, я выбираю первое решение.
Надеюсь эта помощь!

Ссылка на источник

Ответ 2

Для DialogFragment:

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

Ответ 3

Чтобы добавить в решение Audrel, можно динамически разглашать диалоговое окно всякий раз, когда отображается карта, и уменьшайте ее при исчезновении карты (например, когда ваш диалог имеет несколько страниц, одна из них - карта):

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);
}

Еще одно решение, а не устранение основной причины...

Ответ 4

В зависимости от вашей цели для карты в диалоговом окне, если вам не нужны какие-либо элементы управления картой, вы можете использовать liteMode, в котором отображается только изображение карты с любым местом, которое вы загружаете. Он не имеет проблемы с перекрытием z-слоя.

Вы можете добавить это в макет MapView xml:

map:liteMode="true"

Это сработало для меня, потому что я не хотел, чтобы моя карта была интерактивной.

Вы можете прочитать документы Google здесь: https://developers.google.com/maps/documentation/android-api/lite

Ответ 5

Просто добавьте эту строку в стиль !

    <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>