6

Google の新しいツールを使用して、3 つのタブを切り替える機能を持つアプリケーションを起動しています。

ここに画像の説明を入力

これは素晴らしいことですが、古いデバイスのサポートが不足しています。

1.サポート ライブラリで ABS をアプリケーションに追加しました。

2.私はに変更public class MainActivity extends FragmentActivity implements ActionBar.TabListener {しましたpublic class MainActivity extends SherlockFragmentActivity implements ActionBar.TabListener {

3.まだ大量のエラーが残っており、これが古いデバイスで適切に機能するかどうかさえわかりません。2.x 以降と互換性のあるスライド タブを実装する方法に関するヒントはありますか?

ここに画像の説明を入力

アップデート:

alextscの回答のステップ6で立ち往生しています ここに画像の説明を入力

4

5 に答える 5

15

このウィザードを一度試してみましたが、ActionBarSherlock でこの正確なパターンを実装したときに、生成されたコードを完全に破棄したと思います。そのため、通常の「空白」アクティビティをゼロから開始することをお勧めします。ここに小さなステップバイステップガイドがあります。すべての手順が完全に説明されているわけではありませんが、開始するためのキーワードが記載された十分なドキュメントを見つける必要があります。

1) ActionBarSherlock をプロジェクトに追加します (明らかに)

SherlockFragmentActivity2)適切な abs テーマを拡張して設定する新しいアクティビティを作成します

この時点で、アクション バーのある空白のアクティビティが表示されます。

3) レイアウトを変更し、ビューポートを埋める ViewPager を含めます

4) フラグメント (または今のところプレースホルダー) と ViewPager のアダプターを書き込み、これらを一緒に配線します。

ここで必要なすべてを説明するチュートリアルがたくさんあります。たとえば、このブログ投稿.

これにより、アクション バーとスワイプ可能なレイアウトを備えたアクティビティが提供されます。フラグメント間をスワイプできるようになりました。

5) アクション バー タブを追加し、それらに空白のタブ リスナーをアタッチします。

例:

actionBar = getSupportActionBar();

sampleTab = actionBar.newTab()
    .setText(R.string.title)
    .setTag(TABTAG_SAMPLE)
    .setTabListener(tabListener);

actionBar.addTab(sampleTab);

各タブに個別のタグを付けてください (文字列 const で問題ありません)。これは、どのタブが 1 秒間にクリックされたかを識別するために使用されます。また、作成したタブ インスタンスをクラス変数に保持するようにしてください。これらは後で必要になります。タブごとに上記のスニペットを繰り返します。通常の TabListener を使用することもできますが、後でメソッドを 1 つだけオーバーライドする必要があるため、SimpleTabListener を使用することをお勧めします。

これで、アクション バー、スワイプ可能なフラグメント、および (機能しない) タブを含むアクティビティが作成されます。

6)タブリスナーを埋めてビューページャーに接続します

private SimpleTabListener tabListener = new SimpleTabListener() {

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        final String tag = (String) tab.getTag();

        if (TABTAG_SAMPLE.equals(tag)) {
            viewPager.setCurrentItem(INDEX_SAMPLE);
        } else if (TABTAG_SECONDTAB.equals(tag)) {
            viewPager.setCurrentItem(INDEX_SECONDFRAGMENT);
        }
    }
};

これは簡単です。setCurrentItem()タブ選択イベントをリッスンし、保存されたタグを介してどのタブが選択されているかを確認し、特定のタブに関連付けられているフラグメントのインデックスを使用してviewpagers メソッドを呼び出します。

これで、タブを介してフラグメントを選択したり、スワイプしたりできるようになります。特定のフラグメントにスワイプしても、それに応じてタブが同期されず、適切に選択されないことに注意してください。

7) OnPageChangeListener を ViewPager にアタッチし、それに応じてタブを選択します

ここでも、インターフェイスの代わりに SimpleOnPageChangeListener を使用できます。短い例:

private SimpleOnPageChangeListener onPageChangeListener 
        = new SimpleOnPageChangeListener() {

    @Override
    public void onPageSelected(int position) {
        switch (position) {
        case INDEX_SAMPLE:
            actionBar.selectTab(sampleTab);
            break;

        case INDEX_SECONDFRAGMENT:
            actionBar.selectTab(secondTab);
            break;
        }
    };
};

これも自明であるべきです。表示されたフラグメントを変更するスワイプ アクションを監視し、そのインデックスを確認して、適切なタブを選択します。手順 5 のタブ インスタンスを保持しなければならなかった理由は、ここでわかります。タブを選択するには、それらが必要です。

すべてが今すぐ動作するはずです。

于 2012-08-30T18:42:42.487 に答える
3

まったく同じプロセスが私にとってはうまくいきました。すべてのインポートを削除してから、ctrl+shift+o を押して互換性クラスを選択しました。それは絶対にうまくいきました。ここの投稿を参照してください。

于 2013-01-20T16:55:05.067 に答える
0

ActionBarSherlock と互換性ライブラリで動作するViewPagerIndicatorを確認することをお勧めします。現在、2.2 以降でタブをスワイプするためにこれを使用するアプリがあります。

于 2012-08-30T18:25:35.157 に答える
0

コメントを追加できないので、ViewPagerIndicator へのコメントです。私はそれを使用していましたが、ローダーを使用してデータとfragmentadapterをロードし始めたとき、新しいデータが来たときに奇妙な問題が発生することがありました...しかし、actionbarsherlock ViewPagerIndicatorでタブを使用する必要はありません。

于 2012-08-30T18:42:46.497 に答える
0

actionbar sherlock を使用して非常に複雑なアプリケーションを実装しました。私がテストした 2.2 から ICS のデバイスでは問題なく動作します。タブも使用しましたが、すべて正常に動作します。6つのタブがあるはずなので、後でナビゲーションリストに変更しました。まず、actionbar に含まれているデモを試してください。このエラーは、おそらくクラスパスの問題です。lib プロジェクトとして sherlock を追加する必要があり、サポート ライブラリは sherlock lib プロジェクトとプロジェクトの両方に含める必要があります。また、両方のサポート ライブラリが同じバージョンである必要があるかどうかも確認してください。

于 2012-08-30T18:21:51.700 に答える