6

タブスワイプに関して1つの問題に直面しています。私のプロジェクトはAndroid3.2で構築されています。サポートライブラリ4.0(android-support-v4.jar)を使用してタブスワイプを実装しています。実装されたものはすべて正常に機能していますが、アプリをICSデバイスにデプロイすると、ポートレートモードで、タブを選択するためのアクションバーにスピナーが表示されます。ポートレートモードでは、コンテンツは変更されますがスワイプが実行されてもタブの選択は変更されず、ランドスケープモードではすべてが正常に機能します。

final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayHomeAsUpEnabled(true);
// Set up the ViewPager with the sections adapter.
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

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

});

この行にブレークポイントを設定しようとactionBar.setSelectedNavigationItem(position);しましたが、ポートレートモードでも呼び出されますが、選択は変更されません。

誰かがこれを手伝ってくれる?

編集済み:同様の問題が 見つかりましたが、それがどのように解決され、どのようにコードに統合するのか正確にはわかりません。

4

1 に答える 1

17

問題: 実状態が不十分なため、プラットフォームは折りたたまれたナビゲーション(つまり、スピナー)を使用します。システムは、横向きのNAVIGATION_MODE_TABSと縦向きのNAVIGATION_MODE_LISTを自動決定し、向きを横向きから縦向きに変更するとUIが更新されますが、何らかの理由でナビゲーションモードプロパティがNAVIGATION_MODE_LISTに更新されないため、mActionView.setDropdownSelectedPosition(position)は呼び出されません。ActionBarImplの次のコードを参照してください:setSelectedNavigationItem

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

回避策: リフレクションを通じて、タブスピナーオブジェクトを取得し、setSelectionメソッドを呼び出すことができます。

private Spinner getTabSpinner()
{
    try
    {
        int id = getResources().getIdentifier("action_bar", "id", "android");
        View actionBarView = findViewById(id);

        Class<?> actionBarViewClass = actionBarView.getClass();
        Field mTabScrollViewField = actionBarViewClass.getDeclaredField("mTabScrollView");
        mTabScrollViewField.setAccessible(true);

        Object mTabScrollView = mTabScrollViewField.get(actionBarView);
        if (mTabScrollView == null) {
            return null;
        }

        Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField("mTabSpinner");
        mTabSpinnerField.setAccessible(true);

        Object mTabSpinner = mTabSpinnerField.get(mTabScrollView);
        if (mTabSpinner != null)
        {
            return (Spinner)mTabSpinner;
        }
    } 
    catch (Exception e) {
        return null;
    }

    return null;
}

次に、onPageSelectedイベントで上記のメソッドを呼び出します。

        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
            Spinner spinner = getTabSpinner();
            if (spinner != null) {
                spinner.setSelection(position);
            }
        }

この投稿を参照https://gist.github.com/2657485

于 2012-10-07T12:20:28.157 に答える