1

次のアクション バー タブの実装方法は効率的ですか? タブを切り替えるたびに、タブのコンテンツフラグメントが置き換えられ、フレームレイアウトに再度読み込まれるためです。

最初にフラグメントを追加し、タブを切り替えるときにフラグメントをスムーズに(リロードせずに)表示したい。

注: onCreateメソッドですべてのフラグメントを追加しようとしましたが、フラグメントが互いに重なり合っており、すべてのフラグメントがフレーム レイアウトで同時に表示されます。

私のコード:

public class ManageActivity extends SherlockFragmentActivity implements ActionBar.TabListener {

    private Activity mActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_manage);

        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        ActionBar.Tab tab1 = getSupportActionBar().newTab();
        tab1.setText("Tab1");
        tab1.setTabListener(this);
        getSupportActionBar().addTab(tab1);

        ActionBar.Tab tab2 = getSupportActionBar().newTab();
        tab2.setText("Tab2");
        tab2.setTabListener(this);
        getSupportActionBar().addTab(tab2);

        ActionBar.Tab tab3 = getSupportActionBar().newTab();
        tab3.setText("Tab3");
        tab3.setTabListener(this);
        getSupportActionBar().addTab(tab3);
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        String selectedtab = tab.getText().toString();

        if(selectedtab.equalsIgnoreCase("Tab1"))
        {
            getSupportFragmentManager().beginTransaction().replace(R.id.tabfragment_container, new Tab1Fragment()).commit();
        }
        else if (selectedtab.equalsIgnoreCase("Tab2")) {
            getSupportFragmentManager().beginTransaction().replace(R.id.tabfragment_container, new Tab2Fragment()).commit();
        } 
        else if (selectedtab.equalsIgnoreCase("Tab3")){
            getSupportFragmentManager().beginTransaction().replace(R.id.tabfragment_container, new Tab3Fragment()).commit();
        }
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
    }
}

activity_manage.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/tabfragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ManageActivity" >
</FrameLayout>

注: My タブのコンテンツは、ローダー マネージャーを使用して Sqlite からデータをクエリする Listfragments です。

4

1 に答える 1

2

すべてのフラグメントを含むViewPagerを使用します。タブが選択されるたびに、Viewpager の位置を切り替えるだけです。

   @Override
   public void onTabSelected(Tab tab, FragmentTransaction ft) {
      int position = adapter.findItemPosition(this.id);
      ViewPager viewPager = (YourActivity)getActivity().getViewPager(); // Convenience method
      if (viewPager != null) {
         viewPager.setCurrentItem(position, this.shouldScroll);
      } else {
         Log.d(getClass().getSimpleName(), "No pager available");
      }
   }

このコードを機能させるには、Viewpager が必要で、PagerAdapter のインスタンスを介してすべてのタブを ViewPager に追加する必要があります。ほとんどの場合、それほど多くのタブがないため、 FragmentPagerAdapterを使用します。

これにより、ユーザーはタブをスワイプすることもできます。ユーザーがスワイプによって選択したタブを変更した場合、選択したタブを更新する必要があります。すべてのアプリで ActionBarSherlock を使用しています。したがって、次のスニペットは supportActionBar を使用します。このコード例は、スワイプによってタブの変更を更新するために ViewPager に設定できる単純なリスナーです。

   private final class TabPageChangedListener extends ViewPager.SimpleOnPageChangeListener {

      @Override
      public void onPageSelected(int position) {
         ActionBar actionBar = getSupportActionBar();
         if (actionBar != null) {
            actionBar.setSelectedNavigationItem(position);
         } else {
            Log.e(getClass().getSimpleName(),
                  "No actionbar available to change selected tab.");
         }
      }
   }

タブをスワイプ可能にしたくない場合は、ViewPager を上書きしてスワイプ タッチ モーションをインターセプトすることで、スワイプを無効にすることもできます。

于 2012-12-04T10:24:35.323 に答える