我有一个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 全黑。没有标题,没有显示抽屉菜单的侧面按钮。另外,我在谷歌地图上看不到+和 - 标志。
这是预览:
但是,虽然操作栏完全是黑色,但如果我按下菜单按钮所在的位置,菜单显示和菜单按钮和标题将再次显示。
像这样:
然后,在活动活着的时候,我没有遇到过这个问题。
如下所示,一切都很好:
当活动被破坏并且我再次启动时,当我第一次使用谷歌地图导航到mF2时,我再次遇到这个问题。
在具有Android 4.x.x的设备上不会发生这种情况。 仅在使用Android 2.x.x的设备上发生。
知道造成这种情况的原因是什么?
为了防止任何无关的反问题:
非常感谢提前。
[编辑#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 显示正确。因此,当我使用地图(缩放,定位,绘图标记等)执行额外操作时,看起来会出现此问题。
答案 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设备上的基本问题。