簡體   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