【问题标题】:Android CoordinatorLayout : ToolBar scroll only when list starts scrollingAndroid CoordinatorLayout:工具栏仅在列表开始滚动时滚动
【发布时间】:2015-10-03 06:17:25
【问题描述】:

我在我的应用程序中使用工具栏并使用这个link 我正在隐藏工具栏,它按预期完美运行。但是当列表只有一个/两个项目时,不需要像那里那样滚动工具栏底部有足够的空间。

隐藏工具栏的想法是在列表项目超出屏幕高度时利用工具栏空间。但是当列表项目很少时,即小于设备屏幕高度时,我不想滚动工具栏。我如何实现它。 TIA。

代码:

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

<android.support.v7.widget.RecyclerView
    android:id="@+id/my_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

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

    <include
        android:id="@+id/my_awesome_toolbar"
        layout="@layout/tool_bar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_scrollFlags="scroll|enterAlways" />

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

<TextView
    android:id="@+id/empty_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="@string/no_matches_found"
    android:visibility="gone" />


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

【问题讨论】:

    标签: android android-layout android-toolbar android-recyclerview android-support-design


    【解决方案1】:

    最后这个逻辑对我有用。

    1.获取recycleview列表项的高度并乘以总项数。

    1. 获取显示器的高度。

    根据以上两个参数设置工具栏的滚动标志,如下代码:

    private void setScrollIfNeeded() {
        int viewItemHeight = getResources().getDimensionPixelSize(R.dimen.dp); // list item size is fixed in this case
        int totalCount = mRecycleView.getAdapter().getItemCount();
    
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        int height = displaymetrics.heightPixels;
        int width = displaymetrics.widthPixels;
    
        int listHeight = viewItemHeight * totalCount;
        if (listHeight > height) {
            setScrollFlags(true);
        } else {
            setScrollFlags(false);
        }
    }
    
    public void setScrollFlags(boolean set) {
        AppBarLayout.LayoutParams params =
                (AppBarLayout.LayoutParams) mTooolbar.getLayoutParams();
    
        if (set)
            params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
                    | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
        else
    
            params.setScrollFlags(0);
    }
    

    【讨论】:

      【解决方案2】:

      您忘记检查工具栏高度(您需要将此指标添加到列表高度)并在 setScrollFlags 方法中更新工具栏布局参数。

      要计算工具栏高度,一个简单的方法是:

      final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes(new int[]{
            R.attr.actionBarSize});
      int toolbarHeight = (int) styledAttributes.getDimension(0, 0);
      styledAttributes.recycle();
      

      要更新 lp,你需要在方法的末尾添加这一行。

      mTooolbar.setLayoutParams(params);
      

      完整代码:

      private void setScrollIfNeeded() {
          int viewItemHeight = getResources().getDimensionPixelSize(R.dimen.dp); // list item size is fixed in this case
          int totalCount = mRecycleView.getAdapter().getItemCount();
      
          DisplayMetrics displaymetrics = new DisplayMetrics();
          getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
          int height = displaymetrics.heightPixels;
          int width = displaymetrics.widthPixels;
      
          int listHeight = viewItemHeight * totalCount;
      
         final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes(new int[]{
                R.attr.actionBarSize});
          int toolbarHeight = (int) styledAttributes.getDimension(0, 0);
          styledAttributes.recycle();
      
          listHeight += toolbarHeight;
      
      
          if (listHeight > height) {
              setScrollFlags(true);
          } else {
              setScrollFlags(false);
          }
      }
      
      public void setScrollFlags(boolean set) {
          AppBarLayout.LayoutParams params =
                  (AppBarLayout.LayoutParams) mTooolbar.getLayoutParams();
      
          if (set){
              params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
                      | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
          } else {
              params.setScrollFlags(0);
          }
          mTooolbar.setLayoutParams(params);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-23
        • 2017-06-28
        相关资源
        最近更新 更多