第一次使用Google Map加载Fragment时,Android ActionBar变黑了

时间:2013-10-09 12:00:55

标签: android google-maps android-fragments android-actionbar google-maps-android-api-2

我有一个Activity,我在其中创建了DrawerLayout,其中我在侧面菜单中有5个条目,每个菜单条目正在加载它的片段(在代码下面你将只看到3个片段,这是因为最后两个菜单条目现在是假的)。在该Activity上,我设置了自定义ActionBar。 Activity及其onCreate方法如下所示:

public class ActivityOffline extends ActionBarActivity implements OnPreferencesFragmentListener {
    final String[] fragments = { array with fragments path };

    private String[] drawerListViewItems;
    private DrawerLayout drawerLayout;
    private ListView drawerListView;
    private ActionBarDrawerToggle actionBarDrawerToggle;

    private Fragment mF1
    private Fragment mF2
    private Fragment mF3

    @SuppressLint("InlinedApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
        setContentView(R.layout.activity_offline);

        mF1 = Fragment.instantiate(ActivityOffline.this, fragments[0]);
        mF2 = Fragment.instantiate(ActivityOffline.this, fragments[1]);
        mF3 = Fragment.instantiate(ActivityOffline.this, fragments[2]);

        LayoutInflater inflator = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflator.inflate(R.layout.action_bar_custom, null);

        final ActionBar actionBar = getSupportActionBar();

        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setCustomView(v, new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL
                | Gravity.FILL_HORIZONTAL));

        // Get list items from strings.xml
        drawerListViewItems = getResources().getStringArray(R.array.items);

        // Get ListView defined in activity_main.xml
        drawerListView = (ListView)findViewById(R.id.left_drawer);

        // App Icon
        drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);

        // Set the adapter for the list view
        drawerListView.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_listview_item, drawerListViewItems));

        FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
        tx.replace(R.id.content_frame, mF1);
        tx.commit();

        // Create ActionBarDrawerToggle
        actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);

        // Set actionBarDrawerToggle as the DrawerListener
        drawerLayout.setDrawerListener(actionBarDrawerToggle);

        // Еnable and show "up" arrow
        actionBar.setDisplayHomeAsUpEnabled(true);

        // Јust styling option
        drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
        drawerListView.setOnItemClickListener(new DrawerItemClickListener());
    }
    }

当我在菜单项之间切换时,我总是更换这样的片段:

private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(@SuppressWarnings("rawtypes") AdapterView parent, View view, final int position, long id) {
            drawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() {
                @Override
                public void onDrawerClosed(View drawerView) {
                    super.onDrawerClosed(drawerView);

                    if (position < 3) {
                        FragmentTransaction tx = getSupportFragmentManager().beginTransaction();

                        switch (position) {
                        case 0:
                            tx.replace(R.id.content_frame, mF1);
                            break;
                        case 1:
                            tx.replace(R.id.content_frame, mF2);
                            break;
                        case 2:
                            tx.replace(R.id.content_frame, mF3);
                            break;
                        default:
                            tx.replace(R.id.content_frame, mF1);
                            break;
                        }

                        tx.commit();
                    }
                }
            });

            drawerLayout.closeDrawer(drawerListView);
        }
    }

所以,我的拥有谷歌地图的片段是mF2。它的实现和布局文件如下:

实现:

public class FragmentRouteView extends Fragment {
    static final LatLng MY_LOCATION = new LatLng(54.002858, 7.956872);

    private MapView mMapView;
    private GoogleMap mGoogleMap;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_route_view, container, false);
        mMapView = (MapView)v.findViewById(R.id.mapView);
        mMapView.onCreate(savedInstanceState);
        mMapView.onResume();

        try {
            MapsInitializer.initialize(getActivity());
        }
        catch (GooglePlayServicesNotAvailableException e) {
            e.printStackTrace();
        }

        mGoogleMap = mMapView.getMap();

        // Move the camera instantly to start point with a zoom of 15.
        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(MY_LOCATION, 15));

        // Zoom in, animating the camera.
        mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();
        mMapView.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mMapView.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mMapView.onLowMemory();
    }

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black" >

    <com.google.android.gms.maps.MapView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mapView"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

如果你问为什么我在布局文件中有这个视图 - 不要。它解决了我的一些问题,与我目前的问题无关。

总之。在这个介绍之后,这就是问题所在:

当我第一次开始显示这些片段的活动时,我第一次导航到mF2(有谷歌地图),我看到地图,但我的ActionBar 全黑。没有标题,没有显示抽屉菜单的侧面按钮。另外,我在谷歌地图上看不到+和 - 标志。

这是预览:

enter image description here

但是,虽然操作栏完全是黑色,但如果我按下菜单按钮所在的位置,菜单显示和菜单按钮和标题将再次显示。

像这样:

enter image description here

然后,在活动活着的时候,我没有遇到过这个问题。

如下所示,一切都很好:

enter image description here

当活动被破坏并且我再次启动时,当我第一次使用谷歌地图导航到mF2时,我再次遇到这个问题。

在具有Android 4.x.x的设备上不会发生这种情况。 仅在使用Android 2.x.x的设备上发生。

知道造成这种情况的原因是什么?

为了防止任何无关的反问题:

  • 是的,我正在以正确的方式使用支持库
  • 是的,我已正确设置Google Maps API V2密钥
  • 是的,当我从Eclipse
  • 启动应用程序时,我正在使用调试密钥
  • 为什么我在Maps片段布局中使用RelativeLayout而不仅仅是com.google.android.gms.maps.MapView? - 我需要那个神奇的视图 出于某种原因,如果尝试使用com.google.android.gms.maps.MapView 它也没有区别,同样的事情发生了。

非常感谢提前。

[编辑#1]:有一个问题消失的情况:

我忘了补充一下:

如果我从Maps Fragment实现中注释掉这些行:

// Move the camera instantly to start point with a zoom of 15.
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(MY_LOCATION, 15));

// Zoom in, animating the camera.
mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

我看到Google地图以(0,0)坐标为中心,ActionBar 显示正确。因此,当我使用地图(缩放,定位,绘图标记等)执行额外操作时,看起来会出现此问题。

1 个答案:

答案 0 :(得分:0)

已经存在一些已知问题([1][2][3]),在Maps API v2视图顶部呈现UI项目,在UI项目中生成黑盒子。

以下是截至2013年8月27日gmaps-api-issues issue #4659的最新更新:

  

我们刚刚推出了一个更新,它将地图的基本视图更改为Jelly Bean 4.1+(API 16+)设备上的TextureView。这应解决几个问题,包括在屏幕上移动地图视图时的黑色矩形。

     

TextureView是在Ice Cream Sandwich中引入的,但我们发现许多ICS设备存在驱动程序问题和/或TextureView的错误实现。无法为这些设备或任何pre-ICS设备解析渲染工件。

     

为确保您的地图可以使用TextureView,视图需要硬件加速。这可以在应用程序,活动或窗口级别完成。有关此信息,请参阅Android的文档:   http://developer.android.com/guide/topics/graphics/hardware-accel.html

您可能希望尝试在该问题的评论中报告一些变通方法,但似乎无法解决预ICS设备上的基本问题。