7

ViewPager + actionbar Sherlock タブを使用する画面があります。ページャーにsetOnPageChangeListenerセットがあり、次のことを行います。

@Override
public void onPageSelected(final int position) {
    actionBar.setSelectedNavigationItem(position);
}

タブがほとんどなく、すべてのタブが表示されている場合、これは縦向きモードでも横向きモードでも問題なく機能します。ただし、ランドスケープにさらにいくつかのタブを追加すると、これらは 1 つのドロップダウン ウィジェットに折りたたまれます。ViewPager をページングすると、setSelectedNavigationItemメソッドが実行されますが、ドロップダウンの選択には影響しません。最後に選択した値のままです。ユーザーが視覚的な手がかりを失っているので、これは本当に悪いです: タブは「1つ」と言うかもしれませんが、ユーザーはすでにページ #6 にいます.

位置に基づいて表示するタブをプログラムで変更する方法はありますか?

PS私はこれが起こる理由を知っています:これはcom.android.internal.app.ActionBarImplのコードです:

public void setSelectedNavigationItem(int position) {
    switch (mActionView.getNavigationMode()) {
    case NAVIGATION_MODE_TABS:
        selectTab(mTabs.get(position));
        break;
    case NAVIGATION_MODE_LIST:
        mActionView.setDropdownSelectedPosition(position);
        break;
    default:
        throw new IllegalStateException(
                "setSelectedNavigationIndex not valid for current navigation mode");
    }
}

そして、それをステップ実行すると、タブがリストとして表示されますが、ナビゲーションモードがまだ NAVIGATION_MODE_TABS であることがわかります。さて、私のひざまずいた反応は、onConfigurationChanged にコードを入れてナビゲーション モードを適切に設定することですが、これは自動的に行われるべきではありませんか?

PPSそして、パッチを含むAndroidバグがすでに提出されています

4

2 に答える 2

11

質問で参照している Android のバグ (PPS を参照) に基づいて、実際に機能する回避策を示します。ページャーに追加するだけです

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener()
     {
        @Override
        public void onPageSelected(int position)
        {
           actionBar.getTabAt(position).select();
           ViewParent root = findViewById(android.R.id.content).getParent();
           findAndUpdateSpinner(root, position);
        }

        /**
         * Searches the view hierarchy excluding the content view 
         * for a possible Spinner in the ActionBar. 
         * 
         * @param root The parent of the content view
         * @param position The position that should be selected
         * @return if the spinner was found and adjusted
         */
        private boolean findAndUpdateSpinner(Object root, int position)
        {
           if (root instanceof android.widget.Spinner)
           {
              // Found the Spinner
              Spinner spinner = (Spinner) root;
              spinner.setSelection(position);
              return true;
           }
           else if (root instanceof ViewGroup)
           {
              ViewGroup group = (ViewGroup) root;
              if (group.getId() != android.R.id.content)
              {
                 // Found a container that isn't the container holding our screen layout
                 for (int i = 0; i < group.getChildCount(); i++)
                 {
                    if (findAndUpdateSpinner(group.getChildAt(i), position))
                    {
                       // Found and done searching the View tree
                       return true;
                    }
                 }
              }
           }
           // Nothing found
           return false;
        }
     });
于 2012-12-05T20:57:26.483 に答える
0

ファイル ( ActionBarImpl.java ) の ActionBarSherlock ライブラリ プロジェクトにコードを追加する必要があります。このリンクを参照してください。

于 2012-12-05T05:46:58.470 に答える