繁体   English   中英

Android FloatingActionButton隐藏/显示页面更改

[英]Android FloatingActionButton Hide/Show On Page Change

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

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

  1. 如果在多个横向屏幕(例如选项卡上)上有浮动操作按钮,则在进入每个屏幕时,如果每个屏幕上包含的操作不同,该按钮应显示并隐藏。 如果操作相同,则按钮应保留在屏幕上(如有必要,将转换为新位置。)
  2. 对于选项卡式屏幕,浮动操作按钮不应以与屏幕退出相同的方向退出屏幕。 这样做会产生视觉噪音。 它还会导致屏幕上出现无效的浮动操作按钮。 此外,它错误地暗示浮动操作按钮与内容在z级别相同,而不是在根级别的主UI元素级别。

我的第一个想法是有一个FloatingActionButton,只需改变它的颜色和行为,无论我在哪个页面。 这种做法很好,没有消失的行为。 然后我尝试将FloatingActionButton添加到每个页面片段,但随后我得到了不希望的FloatingActionButton结果与页面一起滑动(#2中的禁忌)。

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

我尝试过的另一件事:

  1. 我尝试过一个异步任务,首先调用hide(),更改FloatingActionButton颜色,等待250毫秒,然后调用show()。 这似乎是hacky,但在页面之间滑动时起作用。 但单击选项卡按钮时无效。

所以,如果有人能指出我正确的方向,那将非常感激。

现行代码:

    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);

我遇到了类似的问题。 晶圆厂出现后,我想展示一个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)和onHidden()方法,在更改颜色后调用fab.show()。

问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM