4

OK、私は新しい と を使用してきました。私のアプリでは、ユーザーが を開いたり閉じたりしたかどうかに基づいて、タブを動的に追加および削除Support Libraryしています。ViewPagerTabLayoutSearchView

私の実装は機能します。ただし、タブ インジケーターに視覚的なバグがあるようです。正しいタブ フラグメントが表示されますが、タブ インジケーターが間違ったタブの下にあります!!

これが私の問題であるかどうかを確認するために多くのテストを行いましたが、サポート ライブラリのバグであることがわかりました。Google にバグ レポートを送信しましたが、レポートのステータスは次のようにマークされていました。userError.

そのため、Google の開発者は私に何をすべきかを教えてくれました。私はその修正を試みました。ただし、何も修正されませんでした。ViewPagerこの数時間、正しい動作はが呼び出されるかどうかに依存すると彼が言ったという事実に基づいて、もう少し詳細なテストを行いましたOnPageChangedListener

バグレポートに追加情報を追加しましたが、userError とマークされていたため、開発者が応答するかどうかわかりません。だから私は今ここにいます。

画面収録

問題の画面録画は次の とおりです {注: このリンクをクリックすると、画面録画[.mp4]が自動ダウンロードされます} . タブ インジケータに注意してください。前に表示されたタブに移動する必要がありますが、移動しません。

問題

1. 正しいインジケータ、誤った表示フラグメント

    @Override
    public boolean onMenuItemActionCollapse(final MenuItem item) {

        clearAllTabs();
        addTabs(displayedTabs);

        viewPager.setCurrentItem(previousTabPosition, true);

        tabLayout.removeAllTabs();
        tabLayout.setupWithViewPager(viewPager);

        return true;

    }

スタックトレース:

最初に 2 番目のタブに移動し、[SearchView] をクリックして、[SearchView] を閉じます。

On MenuItemCompat.OnActionExpandListener::onMenuItemActionCollapse(...)

    clearAllTabs()           [A, B, C, Search] -> []
    addTabs(displayedTabs)   [] -> [A, B, C]

    ViewPager.OnPageChangeListener::OnPageSelected(2)
    ViewPager.OnPageChangeListener::OnPageScrolled(2, 0.0, 0)

    viewPager.setCurrentItem(1, true)

    ViewPager.OnPageChangeListener::onPageScrollStateChanged(2)
    ViewPager.OnPageChangeListener::onPageSelected(1)

    tabLayout.removeAllTabs()
    tabLayout.setupWithViewPager(viewPager);

    ViewPager.OnPageChangeListener::onPageSelected(0) [NOTE: this statement does not fire if Tab A was displayed before opening SearchView]

    return true

    ViewPager.OnPageChangeListener::onPageScrolled(0, 0.0, 0)

    // UI display is updated (Tab 1 fragment is displayed, but tab indicator is on 2nd Tab)

    ViewPager.OnPageChangeListener::onPageScrollStateChanged(0)

2.表示されたフラグメントを修正し、タブインジケータを間違った

    @Override
    public boolean onMenuItemActionCollapse(final MenuItem item) {

        clearAllTabs();
        addTabs(displayedTabs);

        tabLayout.removeAllTabs();
        tabLayout.setupWithViewPager(viewPager);

        viewPager.setCurrentItem(previousTabPosition, true);

        return true;

    }

スタックトレース:

最初に 2 番目のタブに移動し、[SearchView] をクリックして、[SearchView] を閉じます。

On MenuItemCompat.OnActionExpandListener::onMenuItemActionCollapse(...)
    clearAllTabs()           [A, B, C, Search] -> []
    addTabs(displayedTabs)   [] -> [A, B, C]

    ViewPager.OnPageChangeListener::OnPageSelected(2)
    ViewPager.OnPageChangeListener::OnPageScrolled(2, 0.0, 0)

    tabLayout.removeAllTabs()
    tabLayout.setupWithViewPager(viewPager);

    ViewPager.OnPageChangeListener::onPageScrollStateChanged(2)
    ViewPager.OnPageChangeListener::onPageSelected(0)

    viewPager.setCurrentItem(1, true)

    ViewPager.OnPageChangeListener::onPageSelected(1)

    return true

    ViewPager.OnPageChangeListener::onPageScrolled(1, 0.0, 0)

    // UI display is updated (Tab 2 fragment is displayed, but tab indicator is on 3rd Tab)

    ViewPager.OnPageChangeListener::onPageScrollStateChanged(0)

GitHub

これが私のGitHubリポジトリです

4

0 に答える 0