[英]Hidden Floating Action Button popping up in CoordinatorLayout
我有一个带有ViewPager
的Activity
,它显示三个不同的片段。 一切都在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.