我遇到了这个问题,Google的NavigationDrawer无法在地图上正确绘制,当我从屏幕一侧拉出它时,它被绘制在地图下而不是它上面,当它从已打开时关闭它是正确显示。
first picture正在关闭它,second pic正在打开它。这是在运行4.1的Galaxy S3上发生的,但在我的Galaxy nexus 4.2上没有问题。我前面有一个ViewPager
和Map
类似的问题,可以通过将地图放在FrameLayout
内,并在其上放置另一个framelayout来修复,但那是在ICS之前的设备上。如果我不得不猜测这与硬件加速有关。
Here's a video YouTube上的错误行动。
答案 0 :(得分:31)
只是使用DrawerLayout.bringChildToFront(View)对我来说不起作用,虽然我添加了DrawerLayout.requestLayout()来电并且它已经完成了!
这是代码
ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(...) {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
drawerLayout.bringChildToFront(drawerView);
drawerLayout.requestLayout();
}
...
}
drawerLayout.setDrawerListener(drawerToggle);
希望这有帮助
答案 1 :(得分:11)
我在少数设备上遇到了同样的问题。我决定在MapFragment(即整个内容框架)之上添加透明视图。这似乎有效,抽屉和阴影都被正确绘制而没有性能问题。我无需在onDrawerSlide
或onDrawerStateChanged
方法中添加任何其他代码。作为该附加视图的背景,我使用了透明的9patch。
布局xml文件:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="@dimen/search_result_height"
android:layout_alignParentBottom="true"
android:visibility="gone" >
</android.support.v4.view.ViewPager>
<!-- Transparent View -->
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/transparent" />
</RelativeLayout>
<ListView
android:id="@+id/left_drawer"
android:layout_width="260dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/foreground"
android:choiceMode="singleChoice"
android:divider="@drawable/divider_drawer_list"
android:dividerHeight="1px"
tools:ignore="PxUsage" />
</android.support.v4.widget.DrawerLayout>
答案 2 :(得分:6)
我用这种方式解决了这个问题: 当你创建ActionBarDrawerToggle时,在'打开'和'关闭'事件之后,你还必须管理'slide'事件,以便将抽屉放在前面,就像那样
public void onDrawerSlide(View drawerView, float slideOffset)
{
getSupportActionBar().setTitle(mDrawerTitle);
supportInvalidateOptionsMenu();
mDrawerLayout.bringChildToFront(drawerView);
}
答案 3 :(得分:3)
通过将抽屉放在每个onDrawerStateChanged()
和 onDrawerSlide()
的前面,我设法解决了这个问题:
public class MainActivity extends ActionBarActivity
{
private DrawerLayout mDrawerLayout;
private View mDrawerView;
private ActionBarDrawerToggle mDrawerToggle;
@Override
protected void onCreate ( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
mDrawerLayout = ( DrawerLayout ) findViewById( R.id.drawer_layout );
mDrawerView = findViewById( R.id.left_drawer );
mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, R.drawable.topbar_menu, R.string.drawer_open,
R.string.drawer_close )
{
@Override
public void onDrawerSlide ( View drawerView, float slideOffset )
{
bringDrawerToFront();
super.onDrawerSlide( drawerView, slideOffset );
}
@Override
public void onDrawerStateChanged ( int newState )
{
bringDrawerToFront();
super.onDrawerStateChanged( newState );
}
private void bringDrawerToFront()
{
mDrawerView.bringToFront();
mDrawerLayout.requestLayout();
}
};
mDrawerLayout.setDrawerListener( mDrawerToggle );
}
}
一个小缺点是暗淡的背景仍在地图下。