简体   繁体   English

当您停止在android中滚动listview / recyclerview时,如何隐藏或显示部分隐藏的工具栏/操作栏

[英]How to hide or show the partially hidden toolbar/actionbar when you stop scrolling the listview/recyclerview in android

So to show and hide the action bar when scrolling I am using this method using coordinator layout and appbarlayout 因此,在滚动时显示和隐藏操作栏我使用协调器布局和appbarlayout使用此方法

But when I stop scrolling the list in the middle of toolbar being hidden or shown it stays there and only part of toolbar is visible. 但是,当我停止滚动工具栏中间的列表被隐藏或显示时,它停留在那里,只有部分工具栏可见。

What I want to do is make the toolbar show or hide completely based on the percentage of toolbar visible. 我想要做的是根据可见工具栏的百分比使工具栏完全显示或隐藏。

Is there a way I can acheive this using the coordinator layout and appbarlayout? 有没有办法可以使用协调器布局和appbarlayout实现这一点?

EDIT - Just get 23.1.0 design library and add "|snap" attribute to your ToolBar layout: 编辑 - 只需获得23.1.0设计库并在ToolBar布局中添加“| snap”属性:

<android.support.design.widget.CoordinatorLayout
    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:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

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

SO YOU DON'T NEED TO USE THE FOLLOWING CODE: 所以你不需要使用以下代码:

Have you tried to add the layout_behaviour attribute to AppBarLayout? 您是否尝试将layout_behaviour属性添加到AppBarLayout?

app:layout_behavior="AppBarLayoutSnapBehavior"

Then you need to create class "AppBarLayoutSnapBehavior": 然后你需要创建类“AppBarLayoutSnapBehavior”:

public class AppBarLayoutSnapBehavior extends AppBarLayout.Behavior {

private ValueAnimator mAnimator;
private boolean mNestedScrollStarted = false;

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

@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
                                   View directTargetChild, View target, int nestedScrollAxes) {
    mNestedScrollStarted = super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
    if (mNestedScrollStarted && mAnimator != null) {
        mAnimator.cancel();
    }
    return mNestedScrollStarted;
}

@Override
public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target) {
    super.onStopNestedScroll(coordinatorLayout, child, target);

    if (!mNestedScrollStarted) {
        return;
    }

    mNestedScrollStarted = false;

    int scrollRange = child.getTotalScrollRange();
    int topOffset = getTopAndBottomOffset();

    if (topOffset <= -scrollRange || topOffset >= 0) {
        // Already fully visible or fully invisible
        return;
    }

    if (topOffset < -(scrollRange / 2f)) {
        // Snap up (to fully invisible)
        animateOffsetTo(-scrollRange);
    } else {
        // Snap down (to fully visible)
        animateOffsetTo(0);
    }
}

private void animateOffsetTo(int offset) {
    if (mAnimator == null) {
        mAnimator = new ValueAnimator();
        mAnimator.setInterpolator(new DecelerateInterpolator());
        mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                setTopAndBottomOffset((int) animation.getAnimatedValue());
            }
        });
    } else {
        mAnimator.cancel();
    }

    mAnimator.setIntValues(getTopAndBottomOffset(), offset);
    mAnimator.start();
}

Should work for you. 应该适合你。

I've got partial solution. 我有部分解决方案。 To your recyclerview add onScrollListener bellow, with AppBarLayout in param 在您的recyclerview中添加onScrollListener,在param中添加AppBarLayout

public class ImprovedScrollListener extends RecyclerView.OnScrollListener {

private WeakReference<AppBarLayout> mAppBarLayout;

public ImprovedScrollListener(AppBarLayout appBarLayout) {
    mAppBarLayout = new WeakReference<>(appBarLayout);
}

@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);

    if (newState == RecyclerView.SCROLL_STATE_IDLE && mAppBarLayout.get() != null) {

        if (!recyclerView.canScrollVertically(-1) && !recyclerView.canScrollVertically(1)) {
            /// TODO: 21.10.2015  handle this state
        }else if(!recyclerView.canScrollVertically(-1)){
            mAppBarLayout.get().setExpanded(true, true);
        } else {
            mAppBarLayout.get().setExpanded(false, true);
        }
    }
}

} }

This will work for recyclerviews that can scroll, this still behaves ugly when recyclerview is not scrollable (see TODO in code). 这将适用于可以滚动的recyclerviews,当recyclerview不可滚动时,这仍然表现得很难看(参见代码中的TODO)。 If somebody find solution for this case let me know 如果有人为此案找到解决方案,请告诉我

Setting Toolbar within AppBarLayout and cordinationLayout will itself take care of hiding and showing the actionBar 在AppBarLayout和cordinationLayout中设置工具栏本身将负责隐藏和显示actionBar

<?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:id="@+id/cordinationLayout"
android:layout_height="match_parent">


<android.support.design.widget.AppBarLayout
    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/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在android中滚动ListView时隐藏ActionBar? - How to hide ActionBar while scrolling ListView in android? 如何在android中滑动时隐藏/显示listview项目上隐藏的组件? - How to hide/show hidden components on items of listview when swipe in android? 滚动recyclerview时如何在状态栏下完全隐藏工具栏 - How to hide toolbar fully under status bar when scrolling recyclerview 使用滚动RecyclerView时如何在ViewPager中隐藏工具栏? - How to hide the toolbar in a ViewPager when using Scrolling RecyclerView? 滚动列表视图时,Android ActionBar隐藏/显示 - Android ActionBar hide/show when scrolling list view 上下滚动时的Android隐藏和显示操作栏 - Android Hide and Show Actionbar when Scrolling up and down 在ListView中滚动时,Android隐藏ActionBar - Android Hide ActionBar while scrolling in a ListView Android 隐藏后如何显示工具栏(通过在 RecyclerView 中向下滚动) - Android how to show toolbar after hiding (by scrolling down in RecyclerView) Android隐藏操作栏和工具栏 - Android Hide actionbar and Toolbar 当列表滚动到顶部时如何制作隐藏/显示工具栏 - How to make hide/show toolbar when our list scrolling to the top
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM