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

时间:2015-09-07 12:30:13

标签: android android-viewpager material-design android-support-library floating-action-button

我有Activity ViewPager,显示三个不同的片段。一切都在CoordinatorLayout内。 我基本上做的与答案中的相同:FAB animation with viewpager/tabslider

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

然而,当首次创建Activity(或旋转屏幕)时,FAB会在第一个Fragment上快速弹出,这真的很烦人。 当我用其他东西替换CoordinatorLayout时,FAB会保持隐藏状态。

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

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

1 个答案:

答案 0 :(得分:2)

这是我提出的代码(不,事先,它不是完美的,也不是最佳的。但它确实有效。随意根据您的需要进行优化)。我会在以后回来清理这个更优雅的学位,但是为了让你快速得到答案,你就去吧。

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可以用于所有选项卡,即使自定义行为影响其可见性。