14

mam aktualną konfigurację:Wyłącz Pasek przewijania

<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/coordiator_layout_in_main" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <android.support.v7.widget.Toolbar 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:minHeight="?attr/actionBarSize" 
     app:layout_scrollFlags="scroll|enterAlways"/> 
</android.support.design.widget.AppBarLayout> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <android.support.design.widget.NavigationView 
     android:layout_width="170dp" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true"/> 

    <FrameLayout 
     // I place a fragment containing a viewpager containing fragments that contain a recyclerview.... 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_toRightOf="@+id/nav_view"> 

    </FrameLayout> 
</RelativeLayout> 

<FrameLayout 
    android:id="@+id/settings_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:visibility="invisible"> 
</FrameLayout> 

<android.support.design.widget.FloatingActionButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/ic_refresh" 
    app:layout_anchor="@id/coordiator_layout_in_main" 
    app:layout_anchorGravity="bottom|right|end" 
    app:layout_behavior="com.material.widget.MyFloatingActionButtonBehavior" /> 

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

teraz wszystko działa zgodnie z oczekiwaniami, jeśli przewijać wewnątrz framelayout który zawiera fragmenty, slajdy na pasku narzędzi i na zewnątrz, jak chcę

Teraz Chodzi mi o to, że chciałbym, aby wyłączałem przesuwanie i wysuwanie paska narzędzi, jeśli przewijam NavView, który znajduje się po stronie frarmayout (i wewnątrz relatywnego)

Ale nie ważne, czy usunę wszystkie s Zachowania przewrotne Pasek narzędzi wciąż ślizga się i wysuwa (wyłączenie tej opcji powoduje usunięcie flagi przewijania z paska aplikacji, ale wyłączenie wszystkich operacji wsuwania i wysuwania z tolbara)

Proszę, czego mi tu brakuje? Czy zachowania kostne nie powinny przekazywać zdarzeń przewijania do elementu CoordinatorLayout?

Odpowiedz

6

Niestetyzawiera NavigationMenuView, który jest RecyclerView i dlatego obsługuje przewijanie zagnieżdżone i przesuwa AppBarLayout podczas przewijania. Najlepszym sposobem rozwiązania tego problemu byłoby przeniesienie NavigationView z CoordinatorLayout. Jeśli nie jest to możliwe, wypróbuj poniższy kod, którego nie przetestowałem.

final RecyclerView navigationMenuView = 
    (RecyclerView) findViewById(R.id.design_navigation_view); 
navigationMenuView.setNestedScrollingEnabled(false); 

Należy wziąć pod uwagę, że nawet jeśli ten kod zadziała, może się zepsuć, gdy biblioteka projektu zostanie zaktualizowana.

6

Przenieś swoje NavigationView wewnątrz DrawerLayout i CoordinatorLayout wewnątrz głównej zawartości DrawerLayout.

Od docs:

NavigationView jest zazwyczaj umieszczona wewnątrz DrawerLayout.

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

<!-- Your contents --> 

<android.support.design.widget.NavigationView 
    android:id="@+id/navigation" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:menu="@menu/my_navigation_items" /> 
</android.support.v4.widget.DrawerLayout> 
6

spróbować,

Umieść ten activity_screen.xml

<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/drawer_layout" 
    android:layout_width="match_parent" android:layout_height="match_parent" 
    android:fitsSystemWindows="true" tools:openDrawer="start"> 

    <include layout="@layout/app_bar_screen" android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <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_home_screen" 
     app:itemIconTint="@color/app_theme_color" 
     app:menu="@menu/activity_home_screen_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

umieścić ten app_bar_screen.xml

<android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="com.test.app.HomeScreenActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay"/> 



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

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


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

umieścić ten content_screen.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:showIn="@layout/app_bar_home_screen" 
    android:id="@+id/content_frame" 
    android:background="@android:color/white" 
    tools:context="com.test.app.HomeScreenActivity"> 


</RelativeLayout> 
+0

Powinieneś skomentować lub opisać swój kod, aby ułatwić zrozumienie. W przeciwnym razie po prostu spowoduje to skopiowanie programistów wklejania. – catch22

+0

tak, ale ja nie dałem żadnej odpowiedzi bez żadnego testu. Ale dziękuję za twoją sugestię. –

0

Dla wszystkich, którzy mogą być zainteresowani, w ten sposób poradziłem sobie z problemem.

tworzę niestandardową wersję NavigationView kopiując odpowiednie pliki tworzą źródło,

one:

  • NavigationView.java
  • NavigationMenuItem.java
  • NavigationMenuPresente.java
  • NavigationMenuView.java
  • ThemeUtils.java

Fix przywozu tak, że nowe punkty NavigationView do nowo skopiowanych plików.

Na koniec dodaj tę setNestedScrollingEnabled(false) do konstruktora z NavigationMenuView.

To dlatego, jak @Michael prawidłowo wskazał NavigationMenuView jest RecyclerView, i jako taka przechodzi swoje zdarzenia przewijania do NestedScrollingParent (w CoordinatorLayout), ustawiając setNestedScrollingEnabled(false) możemy wyłączyć to zachowanie i uzyskać pożądany rezultat (przewijanie NavView nie rozwija/zwija AppBar)

1

Usuń ten wiersz kodu app:layout_scrollFlags="scroll|enterAlways" ze swojego ToolBar. Pracowałem w moim przypadku.