android - 处理滚动状态以在 Fragment 中隐藏 FAB
问题描述
我有一个与 ViewPager 绑定的 FAB,单击它会打开一个片段并隐藏 FAB,但是当我在片段内水平滚动时,FAB 会重新出现。所以我决定通过调用 addOnPageChangeListener 来处理 ViewPager 的滚动状态,并使用自定义 ViewPager 来设置滚动状态(setSwipeEnabled)。这就是问题。要么我让片段不滚动,但片段上的 ViewPager 也不会退出,或者我让按钮重新出现。我试图实现的条件是(如果 FAB 新打开的片段是 !null 不要滚动,否则滚动)。任何帮助表示赞赏!代码:
家活动
mViewPager = findViewById(R.id.viewPager);
mViewPager.setSwipeEnabled(true);
...
mFAB = findViewById(R.id.mainFab);
mViewPager.addOnPageChangeListener(new CustomViewPager.OnPageChangeListener() {
Fragment fragment = null;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(final int position) {
if(position == 2){
mFAB.hide();
}else{
mFAB.show();
}
switch (position){
case 0:
mFAB.setImageResource(R.drawable.ic_handshake_white_54dp);
mFAB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mActionBar.setTitle("New Package");
mFAB.hide();
fragment = new AddPackageFragment();
mFragmentManager.beginTransaction().add(R.id.contentFrame,fragment).addToBackStack("HomeFrag").commit();
//Condition I can't get to work
if(fragment != null){
mViewPager.setSwipeEnabled(false);
}else{
mViewPager.setSwipeEnabled(true);
}
}
});
break;
case 1:
mFAB.setImageResource(R.drawable.ic_mail_outline_24dp);
mFAB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mFAB.hide();
mActionBar.setTitle("New Message");
fragment = new NewMessageFragment();
mFragmentManager.beginTransaction().add(R.id.contentFrame,fragment).addToBackStack(null).commit();
}
});
break;
case 2:
mFAB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragment = new DialogEditRequestFragment();
mFragmentManager.beginTransaction().replace(R.id.contentFrame,fragment).addToBackStack(null).commit();
}
});
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
//Animate fab
if(state == SCROLL_STATE_DRAGGING){
mFAB.hide();
}
if(state == SCROLL_STATE_SETTLING){
mFAB.show();
}
}
});
}
CustomViewPager
public class CustomViewPager extends ViewPager {
private boolean swipePageEnabled;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.swipePageEnabled = false; // By default swiping is disabled
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return this.swipePageEnabled && super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return this.swipePageEnabled && super.onInterceptTouchEvent(event);
}
@Override
public boolean executeKeyEvent(KeyEvent event) {
return this.swipePageEnabled && super.executeKeyEvent(event);
}
public void setSwipeEnabled(boolean enabled) {
this.swipePageEnabled = enabled;
}
public boolean isSwipeEnabled(){
return swipePageEnabled;
}
解决方案
所以我想通了!它只需要一个布尔接口来检查片段是否可见。听起来很简单,但有时你只需要睡觉。
家活动
@Override
public void onFragmentVisible(boolean isVisible) {
if(!isVisible){
mViewPager.setSwipeEnabled(true);
mFAB.show();
}
}
分段
mCloseBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mFragmentVisibilityListener.onFragmentVisible(false);
mActionBarListener.onActionBarListener(R.string.app_name);
getFragmentManager().popBackStack();
}
});
@Override
public void onAttach(Context context) {
super.onAttach(context);
try{
mFragmentVisibilityListener = (OnFragmentInteractionListener) context;
mActionBarListener = (OnFragmentInteractionListener) context;
}catch (ClassCastException e){
throw new ClassCastException(context.toString() + "must implement OnFragmentInteraction Listener");
}
}
@Override
public void onDetach() {
super.onDetach();
mActionBarListener = null;
mFragmentVisibilityListener = null;
}
界面
public interface OnFragmentInteractionListener {
void onActionBarListener(int title);
void onFragmentVisible(boolean isVisible);
希望这对其他人有帮助!
推荐阅读
- ansible - 在 Ansible 中将参数附加到命令模块的末尾
- python-3.x - 纪元时间到日期时间转换python
- wix - AppSearch 的序列号为 50 - 对吧?
- python - 为什么 .astype('bool') 将所有值都转换为 True?
- react-native - 升级到 babel 7 后无法在 travis 上运行 jest
- python - 使用openpyxl比较两个excel文件
- excel - Excel/Google 表格将列转置为行标题
- angular - 在 Angular 5/6 中的自我更改事件中,在 @ng-select/ng-select 中设置默认下拉 bindLabel?
- sql-server - 在表格中按字母顺序对列名进行排序
- ios - 如何避免 IQKeyboard 也向上滚动导航栏?