5

Chcę przewijać tylko elementy menu w widoku nawigacji, ale także przewijam go nagłówkiem. Proszę każdy organ mi powiedzieć jak to osiągnąć ... Oto mój kod:Widok nawigacji w Androidzie: Przewiń tylko pozycje menu:

activity_main.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     .......  
     <android.support.design.widget.NavigationView 
      android:id="@+id/navigation_view" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      app:headerLayout="@layout/header" 
      app:menu="@menu/drawer" /> 
    </android.support.v4.widget.DrawerLayout> 

header.xml

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="190dp" 
     android:background="@drawable/background_material" 
     android:orientation="vertical" 
     > 

     <de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto" 
      android:id="@+id/profile_image" 
      android:layout_width="76dp" 
      android:layout_height="76dp" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_centerVertical="true" 
      android:layout_marginLeft="24dp" 
      android:layout_marginStart="24dp" 
      android:src="@mipmap/ic_launcher" 
      app:border_color="#FF000000"/
    </RelativeLayout> 

drawer_menu_items.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

    <group android:checkableBehavior="single"> 

     <item 
      android:id="@+id/inbox" 
      android:checked="false" 
      android:icon="@drawable/ic_inbox_black" 
      android:title="@string/inbox_string" /> 

     <item 
      android:id="@+id/starred" 
      android:checked="false" 
      android:icon="@drawable/ic_star_black" 
      android:title="@string/starred_string" /> 

     <item 
      android:id="@+id/sent_mail" 
      android:checked="false" 
      android:icon="@drawable/ic_send_black" 
      android:title="@string/sent_mail_string" /> 

     <item 
      android:id="@+id/drafts" 
      android:checked="false" 
      android:icon="@drawable/ic_drafts_black" 
      android:title="@string/draft_string" /> 


     <item 
      android:id="@+id/allmail" 
      android:checked="false" 
      android:icon="@drawable/ic_email_black" 
      android:title="@string/all_mail_string" /> 
     <item 
      android:id="@+id/trash" 
      android:checked="false" 
      android:icon="@drawable/ic_delete_black" 
      android:title="@string/trash_string" /> 
     <item 
      android:id="@+id/spam" 
      android:checked="false" 
      android:icon="@drawable/ic_error_black" 
      android:title="@string/spam_string" /> 
     <item 
      android:id="@+id/abc" 
      android:checked="false" 
      android:icon="@android:drawable/ic_menu_camera" 
      android:title="Camera" /> 
     <item 
      android:id="@+id/abcd" 
      android:checked="false" 
      android:icon="@android:drawable/ic_menu_call" 
      android:title="Call" /> 
     <item 
      android:id="@+id/abcde" 
      android:checked="false" 
      android:icon="@android:drawable/ic_menu_gallery" 
      android:title="Gallery" /> 

     <item 

      android:checked="false" 
      android:icon="@android:drawable/ic_menu_gallery" 
      android:title="Gallery" /> 
     <item 

      android:checked="false" 
      android:icon="@android:drawable/ic_menu_compass" 
      android:title="Compass" /> 
     <item 

      android:checked="false" 
      android:icon="@android:drawable/ic_menu_myplaces" 
      android:title="My Places" /> 

    </group> 
</menu> 

Jak tylko ja nie przewinąć menu nagłówka ... Mam załączeniu kilka zdjęć też ... Before ScrollingAfter Scrolling

+1

Nie możesz tego teraz uzyskać –

+0

Chyba powinienem dodać widok listy wewnątrz widoku nawigacji, zamiast dodawać elementy menu? co o niej mówisz @Gabriele Mariotti –

+0

Nie używaj NavigationView w tym przypadku. –

Odpowiedz

4

powinien być w stanie umieścić nagłówek poza NavigationView, tak:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 

    <!-- nav drawer --> 
    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     > 
     <!-- header --> 
     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="190dp" 
      android:background="@drawable/background_material" 
      android:orientation="vertical" 
      > 

      <de.hdodenhof.circleimageview.CircleImageView 
       android:id="@+id/profile_image" 
       android:layout_width="76dp" 
       android:layout_height="76dp" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true" 
       android:layout_centerVertical="true" 
       android:layout_marginLeft="24dp" 
       android:layout_marginStart="24dp" 
       android:src="@mipmap/ic_launcher" 
       app:border_color="#FF000000" /> 
     </RelativeLayout> 

     <!-- menu --> 
     <android.support.design.widget.NavigationView 
      android:id="@+id/navigation_view" 
      android:layout_width="wrap_content" 
      android:layout_height="0px" 
      android:layout_weight="1" 
      android:layout_gravity="start" 
      app:menu="@menu/drawer" /> 
    </FrameLayout> 
</android.support.v4.widget.DrawerLayout> 

Uwaga: Dodałem FrameLayout do hermetyzacji wszystko w jednym widoku na DrawerLayout, regulowana wysokość w NavigationView do automatycznego korzystania z dostępnej przestrzeni poniżej nagłówka i usunięto atrybut headerLayout.

0

Nie mogłem uzyskać odpowiedzi Lornesa na pracę, ale odniosłem sukces dzięki zastosowaniu niestandardowego NavigationView. Jest bardzo hacky, ale osiąga pożądany efekt.

Metody dodane do niestandardowego NavigationView pozwalają dodać nagłówek na górze NavigationView, a następnie rozmiar menu, tak aby mieścił się pod nagłówkiem.

Komentarze do ulepszenia są mile widziane

overrided NavigationView

public class CustomNavigationView extends NavigationView { 

public CustomNavigationView(Context context) { 
    super(context); 
} 


public CustomNavigationView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 


public CustomNavigationView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 


// Consumes touch in the NavigationView so it doesn't propagate to views below 
public boolean onTouchEvent (MotionEvent me) { 
    return true; 
} 


// Inflates header as a child of NavigationView 
public void createHeader(int res) { 
    LayoutInflater inflater = LayoutInflater.from(getContext()); 
    View view = inflater.inflate(res, this, false); 

    // Consumes touch in the header so it doesn't propagate to menu items below 
    view.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event){ 
      return true; 
     } 
    }); 

    addView(view); 
} 


// Positions and sizes the menu view 
public void sizeMenu(View view) { 
    // Height of header 
    int header_height = (int) getResources().getDimension(R.dimen.nav_header_height); 

    // Gets required display metrics 
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); 
    float screen_height = displayMetrics.heightPixels; 

    // Height of menu 
    int menu_height = (int) (screen_height - header_height); 

    // Layout params for menu 
    LayoutParams params = new LayoutParams(
      LayoutParams.MATCH_PARENT, 
      LayoutParams.WRAP_CONTENT); 
    params.gravity = Gravity.BOTTOM; 
    params.height = menu_height; 
    view.setLayoutParams(params); 
} 

}

I to w onCreate aktywności głównego

// Inflates the nav header 
    CustomNavigationView navigationView = (CustomNavigationView) findViewById(R.id.your_nav_view); 
    navigationView.createHeader(R.layout.your_nav_header); 

    // sizes nav drawer menu so it appears under header 
    ViewGroup parent = (ViewGroup) navigationView; 
    View view = parent.getChildAt(0); 
    navigationView.sizeMenu(view); 
-1

znam jej zbyt stary pytanie, ale to jest za łatwe.

<android.support.design.widget.NavigationView 
      android:id="@+id/navigation_view" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      app:headerLayout="@layout/header" 
      app:menu="@menu/drawer" /> 
    </android.support.v4.widget.DrawerLayout> 

go zmienić na poniższym kodzie (include header inside)

<android.support.design.widget.NavigationView 
      android:id="@+id/navigation_view" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      app:menu="@menu/drawer" /> 

       <include layout="@layout/header"/> 
    </android.support.v4.widget.DrawerLayout> 

praca jak uroku szczęśliwy kodowania :)

0

I również w obliczu thhis problem i rozwiązać go. tutaj jest rozwiązanie

1) Utwórz domyślny szufladę nawigacji w projekcie

2) usunięcia znacznika Główka NavigationView w activity_main.xml i dodać nagłówek wewnątrz NavigationView

<android.support.design.widget.NavigationView 
    android:id="@+id/nav_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main" >>>>>> X 
    app:menu="@menu/activity_main_drawer" > 
    <include 
     layout="@layout/nav_header_main" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</android.support.design.widget.NavigationView> 

3) dodać wymagany puste elementy w górnej części Menu-> activity_main_drawer.xml (depand na wysokości nagłówka

0

I rozwiązać ten problem wykonując

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/drawerLayout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:openDrawer="start"> 

//where your main content goes. 
<include 
    layout="@layout/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<include 
    layout="@layout/nav_drawer_layout" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" /> 

Wewnątrz układu szuflady, zawarte dodać ten układ,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/nav_drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 

//your header layout. 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/nav_header_height" 
    android:gravity="bottom" 
    android:orientation="vertical"> 

    <include layout="@layout/layout_drawer_header"></include> 

</LinearLayout> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/drawerRecyclerView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:layout_weight="1" 
    android:background="#ffffff" /> 

    //your footer layout 
<include layout="@layout/nav_footer_item" /> 

Następnie wystarczy wypełnić widok recyklingu.