繁体   English   中英

隐藏的浮动操作按钮在CoordinatorLayout中弹出

[英]Hidden Floating Action Button popping up in CoordinatorLayout

我有一个带有ViewPagerActivity ,它显示三个不同的片段。 一切都在CoordinatorLayout内部。 我基本上所做的与该答案相同: 使用viewpager / tabslider的FAB动画

我不想在第一个Fragment使用FAB,所以我在布局中将FAB的可见性设置为GONE ,仅在选择第二个Fragment时才显示/隐藏它。 这部分实际上工作正常。

但是,当首次创建“ Activity (或旋转屏幕)时,FAB会在第一个Fragment上弹出一会儿,真是令人讨厌。 当我用其他东西替换CoordinatorLayout时,FAB应该保持隐藏状态。

我正在使用设计支持库23.0.1。 当FAB设置为消失时,cheesesquare样本也存在相同的问题。

有人可以为此建议解决方法吗? 我找不到CoordinatorLayout的源,所以我找不到这种情况发生的原因。

这是我想出的代码(事先没有,它不是完美的,也不是最优的。但是它确实有效。您可以根据自己的喜好进行优化)。 我将稍后再回来进行更详尽的整理,但为了让您快速解决问题,请继续。

private ViewPager viewPager;
private SparseArray<View.OnClickListener> floatingActionButtonOnClickListeners;
private FloatingActionButton floatingActionButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    floatingActionButton = (FloatingActionButton) findViewById(R.id.fab);
    setupTabs();
    setFABOnClickListeners();
}

@Override
protected void onResume() {
    super.onResume();
    setFabVisibility(viewPager.getCurrentItem());
}

private void setupTabs() {
    FragmentStatePagerAdapter adapter = new FragmentStatePagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(adapter);
    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

    viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            setFabVisibility(viewPager.getCurrentItem());
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            switch (state) {
                case ViewPager.SCROLL_STATE_DRAGGING:
                    floatingActionButton.hide();
                    break;
            }
        }
    });
}

private void setFabVisibility(int position) {
    View.OnClickListener floatingActionButtonClickListener = floatingActionButtonClickListeners.get(position);

    floatingActionButton.setOnClickListener(floatingActionButtonClickListener);

    if (floatingActionButtonClickListener == null) {
        hideFabForever();
    } else {
        showFabNormally();
    }
}

private void hideFabForever() {
    ((CoordinatorLayout.LayoutParams) floatingActionButton.getLayoutParams()).setBehavior(new FloatingActionButton.Behavior());
    floatingActionButton.hide();
}

private void showFabNormally() {
    ((CoordinatorLayout.LayoutParams) floatingActionButton.getLayoutParams()).setBehavior(new ScrollAwareFABBehavior(this, null, new ScrollBehaviorListener() {
        @Override
        public void onAnimatedOut(View view) {
        }

        @Override
        public void onAnimatedIn(View view) {
        }
    }));

    floatingActionButton.show();
}

private void setFABOnClickListeners() {
    if (floatingActionButtonOnClickListeners == null) {
        floatingActionButtonOnClickListeners = new SparseArray<>();
    }

    // An example, but populate the SparseArray with the position of the tab
    // that should have a FAB. This will be used to indicate that the FAB 
    // should be visible on that position.
    floatingActionButtonOnClickListeners.put(0, new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO handle click
        }
    });

     floatingActionButtonOnClickListeners.put(2, new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO handle click
        }
    });

    floatingActionButtonOnClickListeners.put(4, new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO handle click
        }
    });
}

一些注意事项:

showFabNormally();

hideFabForever();

仅当您的自定义行为破坏了FAB的可见性时才需要。 在这种情况下,我有一个自定义ScrollAwareFABBehavior,它使FAB在向下滚动时消失,而在向上滚动时重新出现。 您可以选择仅致电

floatingActionButton.show();

floatingActionButton.hide();

分别。 我将行为代码留在那里,以演示如何处理该行为,以便即使一个自定义行为会影响其可见性,也可以将一个FAB用于所有选项卡。

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM