28

当我从屏幕一侧将其拉出时,Google 的 NavigationDrawer 无法在地图上正确绘制,我遇到了这个问题,它是在地图下方而不是在地图上方绘制的,当从已经打开的状态关闭它时,它会正确显示。

第一张图是关闭,第二张图是打开。这发生在运行 4.1 的 Galaxy S3 上,但在我的 Galaxy nexus 4.2 上没有问题。不久前我有一个类似的问题,可以通过将地图放入其中并在其上放置ViewPager另一个框架布局来解决,但这是在 ICS 之前的设备上。如果我不得不猜测这与硬件加速有关。MapFrameLayout

这是YouTube 上正在运行的错误的视频。

4

4 回答 4

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);


希望这可以帮助

于 2013-08-31T21:04:29.190 回答
11

我在少数设备上遇到了同样的问题。我决定在 MapFragment(即整个内容框架)之上添加透明视图。这似乎有效,抽屉和阴影都被正确绘制而没有性能问题。我不必在onDrawerSlideonDrawerStateChanged方法中添加任何额外的代码。作为该附加视图的背景,我使用了透明的 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>
于 2013-10-02T18:14:30.317 回答
6

我以这种方式解决了这个问题:当您创建 ActionBarDrawerToggle 时,在“打开”和“关闭”事件之后,您还必须管理“滑动”事件,以便将抽屉放在前面,就像这样

public void onDrawerSlide(View drawerView, float slideOffset)
{
    getSupportActionBar().setTitle(mDrawerTitle);
    supportInvalidateOptionsMenu();
    mDrawerLayout.bringChildToFront(drawerView);
}
于 2013-06-14T15:12:23.860 回答
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 );
    }

}

一个小缺点是变暗的背景仍在地图下方。

于 2013-09-27T15:10:23.290 回答