Подтвердить что ты не робот

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

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

Первый снимок закрывает его, второй рис. открывает его. Это происходит на Galaxy S3, работающем под управлением 4.1, но на моей Galaxy nexus 4.2 нет проблемы. Некоторое время назад у меня была аналогичная проблема с ViewPager и Map, которая может быть исправлена ​​путем размещения карты внутри FrameLayout с другой функцией frameelayout над ней, но это было на устройствах с предварительной ICS. Если я должен был предположить, что это связано с аппаратным ускорением.

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

4b9b3361

Ответ 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);


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

Ответ 2

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

Ответ 3

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

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

Ответ 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 );
    }

}

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