MapFragment Styled as Dialog делает TextView прозрачным

Вот настройка:

Я создаю и отображаю действия, которые оформлены как центрированные диалоги. Это необходимо для отображения иерархического содержимого, которое не должно быть полноэкранным на устройстве.

Одним из типов контента является карта. Итак, я успешно загрузил MapFragment в диалоговое окно FragmentActivity. Это работает очень хорошо.

Проблема заключается в том, что я пытаюсь разместить новый TextView (действующий как настраиваемая строка заголовка) над картой. Проблема в том, что содержимое TextView кажется прозрачным, а содержимое предыдущего действия просачивается.

Точно такой же «дизайн» прекрасно работает, когда активность карты позволяет отображать карту в полноэкранном режиме. Проблема только тогда, когда я пытаюсь сделать карту нестандартного размера (а также отображать ее вместе с другим видом).

Вот активность:

public class MapViewActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            requestWindowFeature(Window.FEATURE_NO_TITLE);

            setContentView(R.layout.activity_map_view);

            Window window = this.getWindow();
            window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
            window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);

            WindowManager.LayoutParams wmlp = window.getAttributes();
            wmlp.y -= 10;
            window.setAttributes(wmlp);

            Intent i = getIntent();
            String lat = i.getExtras().getString("lat");
            String lng = i.getExtras().getString("lng");
            String title = i.getExtras().getString("title");
            String snippet = i.getExtras().getString("address");

            TextView tv = (TextView)this.findViewById(R.id.mapTitle);
            tv.setText(title);

            SupportMapFragment mf = (SupportMapFragment)this.getSupportFragmentManager().findFragmentById(R.id.map);

            MarkerOptions mo = new MarkerOptions();
            mo.position(new LatLng( Double.valueOf(lat), Double.valueOf(lng) ));
            mo.title(title);
            mo.snippet(snippet);

            GoogleMap gm = mf.getMap();

            gm.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng( Double.valueOf(lat), Double.valueOf(lng) ), 14));
            gm.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            gm.setMyLocationEnabled(true);
            gm.addMarker(mo);

    }
}

Вот макет xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="300dp"
    android:layout_height="365dp" 
    tools:context=".MapViewActivity" >

    <TextView 
        android:id="@+id/mapTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:textSize="18sp"
        android:textColor="@color/white"
        android:background="@color/blue"
        android:text="TEST TITLE LABEL"
    >
    </TextView>

    <fragment
      android:id="@+id/map"
      android:layout_width="match_parent"
      android:layout_height="280dp"
      android:layout_below="@id/mapTitle"
      class="com.google.android.gms.maps.SupportMapFragment" />

</RelativeLayout>

Вот стиль, который я использую при определении Activity в манифесте:

    <style name="SubViewTheme" parent="android:Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/MainViewAnimation</item>
        <item name="android:windowBackground">@color/white</item>
        <item name="android:background">@null</item>
    </style>

Все, что я делаю, чтобы показать активность, это использование стандартного запуска startActivity(i);

А вот и скрин результата. Извините за плохое качество. Очень сложно получить скрин моего Nexus1.

снимок экрана диалогового окна карты"снимок экрана диалогового окна карты"

На снимке экрана вы увидите «диалоговое» действие с картой. И TextView IS появляется - TextView - это маленький темно-синий прямоугольник в правом верхнем углу карты. затем слева от перепутанной метки у нас есть текст из предыдущего диалога, просачивающийся туда, где ДОЛЖЕН быть TextView.

Есть ли что-то очевидное, что я делаю неправильно? Возможно, я слишком амбициозен с новой поддержкой MapFragment :).

Этот проект требует поддержки до 2.3.3, поэтому я застрял с библиотеками поддержки.

Спасибо за любую помощь. Дайте мне знать, если что-то в моем описании не имеет смысла.


person Dan Byers    schedule 02.01.2013    source источник
comment
Я видел нечто подобное. Выполняете ли вы какие-либо транзакции фрагментов при загрузке? Я обнаружил, что если я спрячу mapFragment, а затем снова покажу его, прозрачные TB/views вернутся к жизни. Надеюсь это поможет   -  person Aiden Fry    schedule 14.02.2013
comment
Кроме того, без этого фрагмента кода Window window = this.getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); Карта становится тусклой! неприемлемый!   -  person Aiden Fry    schedule 14.02.2013
comment
Я больше не участвую в этом конкретном проекте, поэтому не могу проверить ваши предложения. Не знаете, что делать с отправленным ответом?   -  person Dan Byers    schedule 26.02.2013
comment
Ну, это работает для меня, но это не совсем приемлемый ответ.   -  person Aiden Fry    schedule 26.02.2013


Ответы (2)


О боже, я не могу поверить, что это единственный ответ, который я нашел....

Создайте еще один фрагмент и при создании выполните фрагментную транзакцию, чтобы скрыть фрагмент вашей карты, пусть он работает в течение определенного периода времени (я ждал возврата вызовов/функций Google Directions), затем выполните еще один FT, чтобы показать фрагмент карты, это устранило проблему прозрачности.

в onCreate

final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.hide(mDirMapFrag);
ft.commit();
getSupportFragmentManager().executePendingTransactions();

// Скрывает карту, по умолчанию отображается фрагмент списка.

//в моем методе, который возвращается из методов направлений Google, но вы можете просто выполнить быстрый обработчик h = new Handler(); h.postDelayed (новый Runnable () {} и т. д.

final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.show(mDirMapFrag);
ft.commit();
getSupportFragmentManager().executePendingTransactions();

У кого-нибудь есть лучшее решение, чем это?

person Aiden Fry    schedule 14.02.2013
comment
Мы пойдем с этим, пока кто-то не придумает лучшее решение :) спасибо! - person Dan Byers; 26.02.2013

Поместите прозрачный вид поверх карты.

<RelativeLayout
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true" />

<View
    android:id="@+id/MyView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent" />
person Radoslav Ignatov    schedule 06.06.2013