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>
Что здесь происходит?
Ответы
Ответ 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>