28

Ich habe dieses Problem mit Googles NavigationDrawer nicht korrekt über die Karte zeichnen, wenn ich es von der Seite des Bildschirms ziehen, wird es unter der Karte statt darüber gezeichnet, beim Schließen es wird bereits geöffnet, es wird korrekt angezeigt.Googles NavigationDrawer zeichnet nicht korrekt über Karte

Die first picture schließt es, die second pic öffnet es. Dies passiert auf einem Galaxy S3 mit 4.1, aber auf meinem Galaxy Nexus 4.2 gibt es kein Problem. Ich hatte ein ähnliches Problem mit einer ViewPager und Map vor einer Weile, die behoben werden konnte, indem Sie die Karte innerhalb einer FrameLayout mit einem anderen framelayout darüber setzen, aber das war auf Pre-ICS-Geräten. Wenn ich raten musste, hat das mit Hardwarebeschleunigung zu tun.

Here's a video des Bugs in Aktion auf YouTube.

+0

Ich hatte das gleiche Problem mit PhotoPreview ... – slezadav

Antwort

6

Ich habe dieses Problem auf diese Weise behoben: Wenn Sie Ihre ActionBarDrawerToggle erstellen, nach 'geöffnet' und 'geschlossen' Ereignisse, müssen Sie auch das 'Folie' Ereignis verwalten, um die Schublade nach vorne zu bringen dass

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

Leider kann ich nicht, wenn diese nicht mehr leicht funktioniert. Das Projekt wurde zu SlidingMenu verschoben, nachdem einige Tage lang niemand geantwortet hatte. Danke trotzdem. – Dennis

+1

Ich stehe vor dem gleichen Problem und das scheint es nicht zu lösen. Ich habe versucht, eine MapView in der XML anstelle von dynamisch erstellten MapFragment ... noch keine Lösung. – Raanan

+1

Haben Sie meine Lösung @Raanan versucht? –

31

Gerade DrawerLayout.bringChildToFront(View) mit nicht für mich arbeiten, obwohl ich einen DrawerLayout.requestLayout() Anruf hinzugefügt und es tat es!

Hier ist der Code

ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(...) { 

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

    ... 
} 

drawerLayout.setDrawerListener(drawerToggle); 


hoffe, das hilft

+1

Danke! Ja, das ist fast perfekt, ich teste gerade auf einem 2.3.5-Gerät und sehe ein kleines Problem, bei dem der Hintergrund nur teilweise verblasst. Aber das ist zumindest schon brauchbar. – Raanan

+1

behoben danke !!! – desgraci

+1

danke seine Arbeit –

3

Ich habe es geschafft, indem die Schublade nach vorne in jedem onDrawerStateChanged()undonDrawerSlide(), um dieses Problem zu umgehen:

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

} 

Ein kleiner Nachteil ist, dass die d Hintergrund ist immer noch unter der Karte.

11

Ich hatte das gleiche Problem auf wenigen Geräten. Ich habe beschlossen, eine transparente Ansicht oben auf MapFragment hinzuzufügen (das ist der gesamte Inhaltsrahmen). Das scheint zu funktionieren, Schublade und Schatten werden ohne Leistungsprobleme richtig gezeichnet. Ich musste keinen zusätzlichen Code in onDrawerSlide oder onDrawerStateChanged Methoden hinzufügen. Als Hintergrund für diese zusätzliche Ansicht habe ich transparentes 9patch verwendet. Datei

Layout-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> 
+0

Das hat perfekt funktioniert, vielen Dank! – galex

+1

Anstatt einen transparenten Zeichensatz zu verwenden, verwenden Sie einfach @android: color/transparent. Dies ist ein leichter Fußabdruck und funktioniert genauso. – jjNford

+0

Arbeitete perfekt auf Android 2.3.6 (Galaxy s i9003), danke! – SergeyA