我有Activity
ViewPager
,显示三个不同的片段。一切都在CoordinatorLayout
内。
我基本上做的与答案中的相同:FAB animation with viewpager/tabslider
我不想在第一个Fragment
中使用FAB,因此我将FAB的可见性设置为布局中的GONE
,并仅在显示时隐藏它选择了第二个Fragment
。这部分实际上工作正常。
然而,当首次创建Activity
(或旋转屏幕)时,FAB会在第一个Fragment
上快速弹出,这真的很烦人。
当我用其他东西替换CoordinatorLayout
时,FAB会保持隐藏状态。
我正在使用设计支持库23.0.1。当FAB设置为消失时,cheesesquare样本具有相同的问题。
有人可以为此建议解决方法吗?我无法找到CoordinatorLayout
的来源,所以我无法找到发生这种情况的原因。
答案 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可以用于所有选项卡,即使自定义行为影响其可见性。