28 votes

NavigationDrawer de Google ne dessine pas correctement sur la carte

Je vais avoir ce problème avec Google NavigationDrawer ne pas dessiner correctement sur la carte quand je le tire du côté de l'écran, il est établi en vertu de la carte au lieu de cela, lors de la fermeture de déjà ouverte, il est indiqué correctement.

La première image est en cours de fermeture, le deuxième pic est de l'ouvrir. Cela se produit sur un Galaxy S3 cours d'exécution 4.1 mais sur mon Galaxy nexus 4.2 il n'y a pas de problème. J'ai eu un problème similaire avec un ViewPager et Map il y a un moment qui pourrait être fixé par mettre la carte à l'intérieur d'un FrameLayout avec un autre framelayout sur elle, mais c'était sur le pré-ICS appareils. Si je devais deviner que cela a à voir avec l'accélération matérielle.

Voici une vidéo de l'insecte en action sur YouTube.

31voto

hick209 Points 311

L'utilisation de DrawerLayout.bringChildToFront (View) n'a pas fonctionné pour moi, bien que j'aie ajouté un appel à DrawerLayout.requestLayout () et il l'a fait!

Voici le code

 ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(...) {

    @Override
    public void onDrawerSlide(View drawerView, float slideOffset)
    {
        super.onDrawerSlide(drawerView, slideOffset);
        mDrawerLayout.bringChildToFront(drawerView);
        mDrawerLayout.requestLayout();
    }

    ...
}

mDrawerLayout.setDrawerListener(mDrawerToggle);
 


J'espère que cela t'aides

11voto

Lecho Points 2807

J'ai eu le même problème sur quelques appareils. J'ai décidé d'ajouter une vue transparente au-dessus de MapFragment (c'est-à-dire le cadre de contenu entier). Cela semble fonctionner, le tiroir et l'ombre sont dessinés correctement sans problèmes de performances. Je n'ai pas eu à ajouter de code supplémentaire dans les méthodes onDrawerSlide ou onDrawerStateChanged . Comme arrière-plan pour cette vue supplémentaire, j'ai utilisé 9patch transparent.

Fichier xml de mise en page:

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

6voto

stranigiorni Points 91

j'ai résolu ce problème de cette manière: lorsque vous créez votre ActionBarDrawerToggle, après les événements 'ouvert' et 'fermé', vous devez gérer également l'événement 'slide', afin d'amener le tiroir à l'avant, comme ça

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

3voto

koral Points 1133

J'ai réussi à contourner ce problème en mettant le tiroir en avant dans chaque onDrawerStateChanged() et 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 );
    }

}
 

Un petit inconvénient est que l'arrière-plan grisé est toujours sous la carte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X