Google NavigationDrawer не правильно рисует карту

У меня возникла проблема с тем, что Google NavigationDrawer не правильно рисует карту, когда я вытаскиваю ее со стороны экрана, она рисуется под картой, а не над ней, когда она закрывается, из уже открытой она отображается правильно.

Первое изображение закрывает его, второй открывает его. Это происходит на Galaxy S3 с 4.1, но на моей Galaxy Nexus 4.2 нет проблем. У меня была аналогичная проблема с ViewPager и Map некоторое время назад, что можно было бы устранить, поместив карту внутри FrameLayout с другой фреймэлейной записью поверх нее, но это было на устройствах pre-ICS. Если бы мне пришлось угадать, это связано с аппаратным ускорением.

Вот видео об ошибке в действии на YouTube.

Solutions Collecting From Web of "Google NavigationDrawer не правильно рисует карту"

Просто использование 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); 

Надеюсь это поможет

У меня была такая же проблема на нескольких устройствах. Я решил добавить прозрачный вид поверх 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> 

Я исправил эту проблему следующим образом: когда вы создаете ActionBarDrawerToggle, после «открытых» и «закрытых» событий, вам нужно также управлять событием «слайд», чтобы привести ящик вперед,

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

Мне удалось обойти эту проблему, доведя ящик до фронта в каждом 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 ); } } 

Небольшой недостаток заключается в том, что затемненный фон все еще находится под картой.