【问题标题】:Google's NavigationDrawer not drawing correctly over mapGoogle Navigation Drawer 无法在地图上正确绘制
【发布时间】:2013-06-06 10:02:06
【问题描述】:

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

first picture 正在关闭它,second pic 正在打开它。这发生在运行 4.1 的 Galaxy S3 上,但在我的 Galaxy nexus 4.2 上没有问题。不久前我遇到了与ViewPagerMap 类似的问题,可以通过将地图放在FrameLayout 中并在其上加上另一个框架布局来解决,但那是在ICS 之前的设备上。如果我不得不猜测这与硬件加速有关。

Here's a video YouTube 上正在运行的错误。

【问题讨论】:

    标签: android google-maps google-maps-android-api-2 navigation-drawer


    【解决方案1】:

    仅使用 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);
    


    希望这会有所帮助

    【讨论】:

    • 请注意,bringChildToFront() 文档已更新为应调用invalidate():“在KITKAT 之前,此方法应调用requestLayout()invalidate() 在此父级上强制父级使用新的子级排序重绘。”
    【解决方案2】:

    我在少数设备上遇到了同样的问题。我决定在 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>
    

    【讨论】:

    • 不要使用透明的drawable,而是使用@android:color/transparent。这是一个更轻的足迹,并且工作方式相同。
    • @Lecho 你能告诉我这个问题在 Android 3.x 上是否仍然存在吗?我不确定是否将正常布局放入 Android 3.x 的 layout-v11 或 Android 4.x 的 layout-v14
    • 我在少数使用 android 4.x 的设备上遇到了这个问题,我不知道 android 3.x 怎么样,但在使用 android 4.x 的某些设备上肯定存在问题。我不确定这个问题是否与 android 版本、gpu 驱动程序或其他问题有关。
    【解决方案3】:

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

    public void onDrawerSlide(View drawerView, float slideOffset)
    {
        getSupportActionBar().setTitle(mDrawerTitle);
        supportInvalidateOptionsMenu();
        mDrawerLayout.bringChildToFront(drawerView);
    }
    

    【讨论】:

    • 遗憾的是,我不能再轻松地检查这是否有效。在几天没有人回答后,将该项目移至 SlidingMenu。还是谢谢。
    【解决方案4】:

    我已经设法解决了这个问题,方法是将抽屉放在每个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 );
        }
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多