MapFragment Styled as Dialog 导致 TextView 透明

Posted

技术标签:

【中文标题】MapFragment Styled as Dialog 导致 TextView 透明【英文标题】:MapFragment Styled as Dialog causes TextView to be transparent 【发布时间】:2012-12-17 02:07:17 【问题描述】:

设置如下:

我正在构建和显示样式为居中对话框的活动。这是为了显示不应在设备上全屏显示的分层内容。

一种类型的内容是地图。所以我已经成功地将一个 MapFragment 加载到一个对话框样式的 FragmentActivity 中。这真的很好用。

问题是当我尝试在地图上方放置一个新的 TextView(充当自定义标题栏)时。问题是 TextView 的内容似乎变得透明,并且之前的 Activity 的内容会渗出。

当地图的活动允许地图全屏时,完全相同的“设计”工作得很好。问题仅在于我尝试将地图设置为自定义大小(并且还与另一个视图一起显示)。

这是活动:

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_
    android:layout_ 
    tools:context=".MapViewActivity" >

    <TextView 
        android:id="@+id/mapTitle"
        android:layout_
        android:layout_
        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_
      android:layout_
      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 - TextView 是地图右上角的小深蓝色矩形。然后在混乱标签的左侧,我们将上一个对话框中的文本从 TextView 应该在的位置流出。

有什么明显的我做错了吗?也许我对新的 MapFragment 支持过于雄心勃勃:)。

这个项目需要支持回到 2.3.3,所以我坚持使用支持库。

感谢您的帮助。如果我的描述中的任何内容没有意义,请告诉我。

【问题讨论】:

我见过类似的事情。加载时是否进行任何片段事务?我发现如果我隐藏 mapFragment 然后再次显示它,透明的 TB / 视图将恢复生机。希望这会有所帮助 另外没有这段代码“Window window = this.getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);”地图变暗了!不可接受! 我不再参与这个特定的项目,所以我无法测试您的建议。不确定如何处理您提交的答案? 它对我有用,但它不是一个真正可以接受的答案。 【参考方案1】:

在地图顶部放置一个透明视图。

<RelativeLayout
    android:id="@+id/map"
    android:layout_
    android:layout_
    android:clickable="true" />

<View
    android:id="@+id/MyView"
    android:layout_
    android:layout_
    android:background="@android:color/transparent" />

【讨论】:

【参考方案2】:

天哪,我不敢相信这是我找到的唯一答案......

创建另一个片段并在创建时执行 fragmentTransaction 以隐藏您的地图片段让它运行一段时间(我等待我的 Google 方向调用/函数返回)然后执行另一个 FT 以显示 mapFragment 这修复了透明度问题。

在创建时

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

//隐藏地图,默认显示列表片段。

//在我的方法中,它是从谷歌方向方法返回的,但你可以做一个快速的处理程序 h = new Handler(); h.postDelayed(new Runnable() 等。

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

还有比这更好的解决方案吗?

【讨论】:

我们将继续使用这个,直到有人提出更好的解决方案:) 谢谢!

以上是关于MapFragment Styled as Dialog 导致 TextView 透明的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 typescript 的样式化组件“as”prop

SupportMapFragment vs MapFragment性能方面

从另一个活动返回时,MapFragment 的地图加载滞后

带有 MapFragment 快照的活动

我应该使用 MapView 还是 MapFragment

无法实例化 android.gms.maps.MapFragment