【问题标题】:Prevent FloatingActionButton became visible within CoordinatorLayout, ViewPager, Fragment防止 FloatingActionButton 在 CoordinatorLayout、ViewPager、Fragment 中可见
【发布时间】:2016-08-19 09:58:48
【问题描述】:

我在CoordinatorLayout 中实现了ViewPagerFloatingActionButtonFloatingActionButton 有一个 layout_behavior 设置为自定义 ScrollAwareFABBehavior。在滑动寻呼机时,工厂成功更改可见性(动画)以及滚动嵌套视图。我已经实现了所有必要的支持库 (23.3.0)。

寻呼机显示 2 Fragments:

  1. RecyclerView(必须展示工厂)
  2. NestedScrollView(不得展示工厂)

在页面更改时,活动会询问子片段(界面)是否显示 fab。这很好用,但是在第二个片段中向下滚动滚动视图时,fab 再次可见。

如何防止在向下滚动 NestedScrollView 时再次显示 fab?

【问题讨论】:

  • 您可以只将 FloatingActionButton 添加到第一个片段而不是活动,或者在启动第二个片段时手动隐藏它
  • 如果我将它添加到第一个片段上,它会随着 viewpager 幻灯片滑走。这不是指南所说的:晶圆厂必须在滑动浏览器视图上保持在同一位置!

标签: android android-viewpager android-coordinatorlayout floating-action-button android-nestedscrollview


【解决方案1】:

好的,我收到了一位 G+ 用户的答复(感谢 Christophe Beyls)!

在主要活动(或主要片段)上检索 CoordinatorLayout.Behavior 实例:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    CoordinatorLayout rootView = (CoordinatorLayout) inflater.inflate(R.layout.main, container, false);
    FloatingActionButton fab = (FloatingActionButton) mRootView.findViewById(R.id.fab);
    CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
    CoordinatorLayout.Behavior b = lp.getBehavior();

    if (b instanceof ScrollAwareFABBehavior) { // my custom behavior
        // saving ref for later use
        mFABBehavior = (ScrollAwareFABBehavior) b;
    }

    // do other stuff

    return rootView;
}

ScrollAwareFABBehavior.java 中添加:

public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {
    private boolean mFabUserHidden = false;

    // other stuff in here

    /**
     * Overrides the default FAB show/hide functionality
     *
     * @param hidden    TRUE to stay hidden, false otherwise
     */
    public void stayHidden(boolean hidden) {
        mFabUserHidden = hidden;
    }

    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);

        if (dyConsumed > 0 && !this.mIsAnimatingOut && child.getVisibility() == View.VISIBLE) {
            animateOut(child);
        } else if (dyConsumed < 0 && !mFabUserHidden && child.getVisibility() != View.VISIBLE) {
            animateIn(child);
        }
    }

    // do other stuff

}

ViewPager.OnPageChangeListener 中,您可以为每个片段设置工厂是否可见。

也许它会帮助任何有同样问题的人!

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2016-03-07
    • 1970-01-01
    • 2015-09-12
    • 2020-10-11
    • 2020-12-07
    相关资源
    最近更新 更多