Android FloatingActionButton隐藏/显示页面更改

时间:2015-10-02 23:55:40

标签: android

我有一个标签式布局,使用SmartTabLayout,右下角有一个FloatingActionButton。当我转换到另一个页面时,我想隐藏FloatingActionButton,然后使其重新显示为不同的颜色和不同的图标。但是当我调用hide()方法时,更改图标,然后调用show()方法,hide()方法在调用show()之前没有完成它的动画,导致FloatingActionButton没有重现。

为什么我这样做?根据找到的here浮动操作按钮的材料设计,在处理选项卡式布局时应遵循以下两条规则:

  1. 如果在多个横向屏幕(例如选项卡上)上有浮动操作按钮,则在进入每个屏幕时,如果每个屏幕上包含的操作不同,该按钮应显示并隐藏。如果操作相同,则按钮应保留在屏幕上(如有必要,将转换为新位置。)
  2. 对于选项卡式屏幕,浮动操作按钮不应以与屏幕退出相同的方向退出屏幕。这样做会产生视觉噪音。它还会导致屏幕上出现无效的浮动操作按钮。此外,它错误地暗示浮动操作按钮与内容在z级别相同,而不是在根级别的主UI元素级别。
  3. 我的第一个想法是拥有一个FloatingActionButton,只需改变它的颜色和行为,无论我在哪个页面上。这种做法很好,没有消失的行为。然后我尝试向每个页面片段添加一个FloatingActionButton,但后来我得到了不希望的FloatingActionButton结果与页面一起刷掉(#2中的禁忌)。

    所以,现在我回到了一个FloatingActionButton。

    我尝试过另一件事:

    1. 我尝试过一个异步任务,首先调用hide(),更改FloatingActionButton颜色,等待250毫秒,然后调用show()。这似乎是hacky,但在页面之间滑动时起作用。但是点击标签按钮时没有用。
    2. 所以,如果有人能指出我正确的方向,那将非常感激。

      当前代码:

          HomeTabBar bar = new HomeTabBar();
          ViewGroup tab = (ViewGroup) findViewById(R.id.container);
          tab.addView(LayoutInflater.from(this).inflate( R.layout.demo_custom_tab_icons1 , tab, false));
      
          mViewPager = (ViewPager) findViewById(R.id.viewpager);
          SmartTabLayout viewPagerTab = (SmartTabLayout) findViewById(R.id.viewpagertab);
          final ViewGroup view = (ViewGroup) findViewById(android.R.id.content);
          viewPagerTab.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
      
              private int currentPage;
      
              @Override
              public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
              }
      
              @Override
              public void onPageSelected(int position) {
                  currentPage = position;
              }
      
              @Override
              public void onPageScrollStateChanged(int state) {
                  int colorIndex = Color.RED;
                  mFab.hide();
                  switch (currentPage) {
                      case 0:
                          colorIndex = Color.RED;
                          mFab.setImageDrawable(getResources().getDrawable(R.drawable.plus_sign));
                          mFab.show();
                          break;
                      case 2:
                          colorIndex = Color.argb(255, 76, 175, 80);
                          mFab.setImageDrawable(getResources().getDrawable(R.drawable.ic_add_bowling_ball_white_24dp));
                          mFab.show();
                          break;
                      case 3: colorIndex = Color.BLUE;
                          mFab.setImageDrawable(getResources().getDrawable(R.drawable.ic_add_location_white_24dp));
                          mFab.show();
                          break;
                      default: // Leaves the FAB hidden on any other tabs
                          break;
                  }
                  mFab.setBackgroundTintList(ColorStateList.valueOf(colorIndex));
              }
          });
      
          bar.setup(viewPagerTab);
      
          FragmentPagerItems pages = new FragmentPagerItems(this);
          for (Integer title : bar.tabs()) {
              switch( title ) {
                  case R.string.player_fragment_tag:
                      pages.add(FragmentPagerItem.of(getString(title), PlayerFragment.class));
                      break;
                  case R.string.series_fragment_tag:
                      pages.add(FragmentPagerItem.of( getString( title ), SeriesFragment.class));
                      break;
                  case R.string.balls_fragment_tag:
                      pages.add(FragmentPagerItem.of( getString( title ), BallsFragment.class));
                      break;
                  case R.string.location_fragment_tag:
                      pages.add(FragmentPagerItem.of( getString( title ), BowlingAlleyFragment.class));
                      break;
                  default:
                      break;
              }
      
          }
      
          FragmentPagerItemAdapter adapter = new FragmentPagerItemAdapter(
                  getSupportFragmentManager(), pages){
              @Override
              public int getItemPosition(Object object) {
                  return POSITION_NONE;
              }
          };
      
          mViewPager.setAdapter(adapter);
          viewPagerTab.setViewPager(mViewPager);
      
          mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
          setSupportActionBar(mToolbar);
      

1 个答案:

答案 0 :(得分:3)

我有类似的问题。晶圆厂出现后,我想展示一个Snackbar。我这样解决了:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

FloatingActionButton.OnVisibilityChangedListener fabListener;

fabListener = new FloatingActionButton.OnVisibilityChangedListener(){
  @Override
  public void onShown(FloatingActionButton fab) {

    Snackbar.make(fab, "Replace with your own action", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show();

    super.onShown(fab);
  }
};

fab.show(fabListener);

我认为您只需要使用fab.hide(fabListener)和更改颜色后调用fab.show()的onHidden()方法。

问候