【问题标题】:Hide AppBar when scrolling down向下滚动时隐藏 AppBar
【发布时间】:2016-05-12 11:04:18
【问题描述】:

我的布局中有一个AppBar 和一个水平线性布局(包括一个编辑文本和两个图像按钮)和其他东西。当用户向下滚动时,我希望AppBar(实际上,Toolbar 隐藏。这是我尝试过的,appbar 没有隐藏它只是停留在那里。我跟着@987654321 @。

这是我的应用的截图:

当用户滚动时,我希望 AppBar/Toolbar 消失,并且包含编辑文本的水平布局替换 appbar 并保持在那里。

你能告诉我我做错了什么吗?

<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_height="match_parent"
    android:layout_width="match_parent"
    android:fitsSystemWindows="true"> 

<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/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/my_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:elevation="4dp"
            android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            xmlns:android="http://schemas.android.com/apk/res/android"
            app:layout_scrollFlags="scroll|enterAlways|snap"
            />

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

        <LinearLayout 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"
            android:orientation="vertical"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            tools:showIn="@layout/activity_show" tools:context="com.example.bimpc1.sozluk.GosterActivity"
            android:background="@color/white"
            android:id="@+id/mylin">

        <View
            android:layout_width="fill_parent"
            android:layout_height="30dp">
        </View>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:id="@+id/topLayout"
            android:layout_alignParentTop="true"
            android:paddingLeft="10dp"
            android:paddingRight="10dp">

            <ImageButton
                android:id="@+id/btn_sil"
                android:layout_width="45dp"
                android:layout_height="45dp"
                android:gravity="center"
                android:src="@drawable/delete"
                android:background="@color/white"
                android:paddingRight="10dp"
                android:paddingLeft="10dp"
                android:paddingTop="0dp"
                android:paddingBottom="15dp"
                />

            <EditText
                android:gravity="center"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:id="@+id/et_word"
                android:ems="12"
                android:background="@android:color/transparent"/>

            <ImageButton
                android:id="@+id/btn_getir"
                android:layout_width="45dp"
                android:layout_height="45dp"
                android:gravity="center"
                android:src="@drawable/search"
                android:background="@color/white"
                android:paddingRight="10dp"
                android:paddingLeft="10dp"
                android:paddingTop="0dp"
                android:paddingBottom="15dp"
                />

        </LinearLayout>

        <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:fillViewport="true"
        android:layout_below="@+id/topLayout"
        xmlns:app="http://schemas.android.com/apk/res-auto">
            <!--many views inside scrollview..... -->

        </ScrollView>

</LinearLayout>

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

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

【问题讨论】:

标签: android android-layout android-toolbar android-appbarlayout


【解决方案1】:

实际上,那个设计似乎是错误的。为什么?让我向你解释一下。

除了那些没有必要的xmlns:android="http://schemas.android.com/apk/res/android" 或使用:android:layout_alignParentTop="true"LinearLayout 或在内容下使用ScrollView 等,似乎你不知道发生了什么。 (没问题)。

注意:最重要的是,添加:

app:layout_behavior="@string/appbar_scrolling_view_behavior" 这里也提到了:

http://guides.codepath.com/android/Handling-Scrolls-with-CoordinatorLayout

这个标志应该隐藏那个部分:(exitUntilCollapsed)

app:layout_scrollFlags="scroll|exitUntilCollapsed"

exitUntilCollapsed:设置滚动标志后,向下滚动将 通常会导致整个内容移动。

最后:http://i.stack.imgur.com/qf1So.gif

希望这是您要找的,如果不是,请编辑您的问题并添加一些屏幕截图。

随意更改标志或添加新标志以实现您的确切需要。


更新:

如果你想在折叠后隐藏那个Toolbar(红色部分),只需在CollapsingToolbarLayout中使用它:

app:layout_scrollFlags="scroll|snap"

最后,你会得到相同的结果(类似于 googleplay 设计)。

代码:

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

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <!-- Your Scrollable contents should be here - such as,
            ViewPager or etc -->

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:scrollbarSize="15sp"
                android:text="You Contents" />

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

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsingtoolbarly"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                app:contentScrim="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|snap">

                <android.support.v7.widget.Toolbar
                    android:id="@+id/my_toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    android:elevation="4dp"
                    android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="190dp"
                    android:minHeight="190dp"
                    android:scaleType="fitXY"
                    android:src="@drawable/header"
                    app:layout_collapseMode="parallax" />


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

            <LinearLayout
                android:id="@+id/mylin"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <View
                    android:layout_width="fill_parent"
                    android:layout_height="30dp" />

                <LinearLayout
                    android:id="@+id/topLayout"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">

                    <ImageButton
                        android:id="@+id/btn_sil"
                        android:layout_width="45dp"
                        android:layout_height="45dp"
                        android:background="@drawable/ic_arrow_drop_up_black_24dp"
                        android:gravity="center"
                        android:paddingBottom="15dp"
                        android:paddingLeft="10dp"
                        android:paddingRight="10dp"
                        android:paddingTop="0dp" />

                    <EditText
                        android:id="@+id/et_word"
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:background="@android:color/transparent"
                        android:ems="12"
                        android:gravity="center" />

                    <ImageButton
                        android:id="@+id/btn_getir"
                        android:layout_width="45dp"
                        android:layout_height="45dp"
                        android:background="@drawable/ic_arrow_drop_up_black_24dp"
                        android:gravity="center"
                        android:paddingBottom="15dp"
                        android:paddingLeft="10dp"
                        android:paddingRight="10dp"
                        android:paddingTop="0dp" />

                </LinearLayout>

            </LinearLayout>

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


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

    <!-- And finally, 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"
          app:headerLayout="@layout/app_header"
          app:insetForeground="@color/app_color_primary_dark"
          app:menu="@menu/navigation_menu" /> -->

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

结果:折叠后,searchedittext不会隐藏:

更新:新方法:)

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

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:id="@+id/mylin"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <View
                android:layout_width="fill_parent"
                android:layout_height="30dp" />

            <LinearLayout
                android:id="@+id/topLayout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <ImageButton
                    android:id="@+id/btn_sil"
                    android:layout_width="45dp"
                    android:layout_height="45dp"
                    android:background="@drawable/ic_arrow_drop_up_black_24dp"
                    android:gravity="center"
                    android:paddingBottom="15dp"
                    android:paddingLeft="10dp"
                    android:paddingRight="10dp"
                    android:paddingTop="0dp" />

                <EditText
                    android:id="@+id/et_word"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:background="@android:color/transparent"
                    android:ems="12"
                    android:gravity="center" />

                <ImageButton
                    android:id="@+id/btn_getir"
                    android:layout_width="45dp"
                    android:layout_height="45dp"
                    android:background="@drawable/ic_arrow_drop_up_black_24dp"
                    android:gravity="center"
                    android:paddingBottom="15dp"
                    android:paddingLeft="10dp"
                    android:paddingRight="10dp"
                    android:paddingTop="0dp" />

            </LinearLayout>

        </LinearLayout>

        <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <!-- Your Scrollable contents should be here - such as,
            ViewPager or etc -->

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:scrollbarSize="15sp"
                android:text="You Contents" />

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

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:elevation="4dp"
                app:layout_scrollFlags="scroll|enterAlways"
                android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

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


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

    <!-- And finally, 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"
          app:headerLayout="@layout/app_header"
          app:insetForeground="@color/app_color_primary_dark"
          app:menu="@menu/navigation_menu" /> -->

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

结果:

【讨论】:

  • 谢谢,我添加了我的应用程序的屏幕截图,我想我想要的是更简单的东西。
  • @jason - 请检查我更新的答案,我想我找到了你到底在尝试什么。
  • 感谢您的回答。有效!除了应用栏标题消失了。谢谢。
  • Jason 我相信你需要接受@Linx ans,因为他解释得很好,否则再发一个问题。
  • 更新答案对我有用。我正在使用 scrollView 和 BottomAppBar 但这个解决方案仍然有效。我用 NestedScrollView 替换了 ScrollView。
【解决方案2】:

希望这篇文章对你有所帮助:https://guides.codepath.com/android/Handling-Scrolls-with-CoordinatorLayout

尝试使用 CoordinatorLayout 和 CollapsingToolbar。

<android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways">    
        </android.support.v7.widget.Toolbar>

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

【讨论】:

    【解决方案3】:

    检查一下,你需要在 CoordinatorLayout 和 CollapsingToolbar 中为它设置标志,

      <android.support.design.widget.CoordinatorLayout
             xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto"
             android:layout_width="match_parent"
             android:layout_height="match_parent">
    
         <android.support.v4.widget.NestedScrollView
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
             <!-- Your scrolling content -->
    
         </android.support.v4.widget.NestedScrollView>
    
         <android.support.design.widget.AppBarLayout
                 android:layout_height="wrap_content"
                 android:layout_width="match_parent">
    
             <android.support.v7.widget.Toolbar
                     ...
                     app:layout_scrollFlags="scroll|enterAlways"/>
    
             <android.support.design.widget.TabLayout
                     ...
                     app:layout_scrollFlags="scroll|enterAlways"/>
    
         </android.support.design.widget.AppBarLayout>
    
     </android.support.design.widget.CoordinatorLayout>
    

    http://developer.android.com/reference/android/support/design/widget/AppBarLayout.html

    【讨论】:

      【解决方案4】:

      您需要像这样构建布局:

      <android.support.design.widget.CoordinatorLayout >
          <android.support.design.widget.AppBarLayout >
              <android.support.design.widget.CollapsingToolbarLayout >
                  <ImageView />
                  <android.support.v7.widget.Toolbar />
              </android.support.design.widget.CollapsingToolbarLayout>
          </android.support.design.widget.AppBarLayout>
          <!-- Your scrollable content here -->
      </android.support.design.widget.CoordinatorLayout>
      

      完整教程在:http://blog.grafixartist.com/toolbar-animation-with-android-design-support-library/

      【讨论】:

        【解决方案5】:

        Drawer.Layout 中添加android:fitsSystemWindows="true"

        <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout"
            .../...
            // add in
            android:fitsSystemWindows="true">
        

        最好把你的顾虑分开。使用chrisbanes/cheesesquare 提供的示例,您的布局看起来会更好:

        <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout"
            .../...
            // add in
            android:fitsSystemWindows="true">
        
        <android.support.design.widget.CoordinatorLayout .../...>
        
        <android.support.design.widget.AppBarLayout .../...>
        
            <android.support.v7.widget.Toolbar 
                // Why are you using two themes?
                // android:theme="@style/ThemeOverlay.AppCompat.ActionBar"/>
        
        </android.support.design.widget.AppBarLayout>
        
        <android.support.v4.view.ViewPager 
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
        </android.support.design.widget.CoordinatorLayout>
        </android.support.v4.widget.DrawerLayout>
        

        替换这个:

            <LinearLayout .../...>
            <View .../...>
            </View>
            <LinearLayout .../...>
                <ImageButton
                    .../...
                    />
            </LinearLayout>
            <ScrollView .../...>
            <!--many views inside scrollview..... -->
            </ScrollView>
            </LinearLayout>
        

        <android.support.v4.view.ViewPager 
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
        

        然后使用 ViewPager 填充您的列表。

         ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
            if (viewPager != null) {
                setupViewPager(viewPager);
            }
        
        private void setupViewPager(ViewPager viewPager) {
            Adapter adapter = new Adapter(getSupportFragmentManager());
            adapter.addFragment(new CheeseListFragment(), "Category 1");
            adapter.addFragment(new CheeseListFragment(), "Category 2");
            adapter.addFragment(new CheeseListFragment(), "Category 3");
            viewPager.setAdapter(adapter);
        }
        

        然后您可以格式化此 CheeseListFragment 以单独添加您的图像视图。

        也没有必要继续声明你的架构:

        xmlns:app="http://schemas.android.com/apk/res-auto"
        

        这表明您正在复制和粘贴代码并且不理解它。

        您还应该使用不带视图的nestedScrollView,并在其上方使用线性布局。请注意,目前尚不清楚您要达到什么目的。

        【讨论】:

        • 感谢您的回答。我想要实现的是,当您向下滚动时,应用栏应该隐藏,但水平线性布局不应该隐藏。就这样。我不认为我需要一个 viewpager,我只是有滚动视图。
        • @jason - 你能截取你想要实现的目标吗?虽然不清楚,但似乎超出了 Material Design 的规则。而且你的代码有很多问题。ScrollViewLinearLayout 一切似乎都不正确。
        • @MsYvette - 是的,我看到了答案,其中大部分都是正确的,因为 OP 说:When user scrolls down, I want appbar to hide 我认为他/她想要实现类似这个标志的东西:scroll|exitUntilCollapsed.I'我同意,但是,需要编辑问题,因为 OP 给了它一个赏金问题。
        • 谢谢,我添加了我的应用的屏幕截图。
        • @MsYvette - 是的,我也同意,但问题不是很清楚 OP 试图这样做,我想说的是,无论如何,让我们帮助他/她我的回答是澄清代码并修复它们:)就是这样,是的,谢谢;)
        【解决方案6】:

        为了隐藏工具栏,请使用下面的代码。

        toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();
        

        【讨论】:

          【解决方案7】:

          试试这个代码:使用 layout_scrollFlags 如下:

          app:layout_scrollFlags="scroll|enterAlways"

          您的 XML 文件更改如下:

          <?xml version="1.0" encoding="utf-8"?>
          
          <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"
              tools:context="MainActivity">
          
          <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"
                  app:layout_scrollFlags="scroll|enterAlways"
                  android:layout_width="match_parent"
                  android:layout_height="?attr/actionBarSize"
                  android:background="?attr/colorPrimary"
                  app:popupTheme="@style/AppTheme.PopupOverlay"/>
          
              <android.support.design.widget.TabLayout
                  android:id="@+id/tabs"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  app:tabMode="fixed"
                  app:tabGravity="fill"/>
          
          </android.support.design.widget.AppBarLayout>
          
          <include layout="@layout/content_main" />
          
          </android.support.design.widget.CoordinatorLayout>
          

          这是 content_main XML 文件

          <android.support.v4.widget.NestedScrollView
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          xmlns:android="http://schemas.android.com/apk/res/android"
          app:layout_behavior="@string/appbar_scrolling_view_behavior">
          
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
          
          
          </LinearLayout>
          
          </android.support.v4.widget.NestedScrollView>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-06-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-30
            • 2016-01-17
            • 1970-01-01
            • 2023-01-17
            相关资源
            最近更新 更多