android - 如何在不每次都重新加载 fragment 的情况下在操作栏选项卡之间平滑切换

标签 android

我的以下Action bar Tab 实现 方法是否有效?因为每当我在选项卡之间切换时,选项卡内容 fragment 都会被替换并在框架布局中再次加载。

我想自己第一次添加 fragment ,并在选项卡之间切换时顺利显示 fragment (无需重新加载)。

注意:我尝试在onCreate 方法中添加所有 fragment 。但 fragment 彼此重叠,并同时在框架布局中显示所有 fragment 。

我的代码:

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>

注意:我的 Tab 内容是 Listfragments,它使用加载器管理器从 Sqlite 查询数据。

最佳答案

我使用 ViewPager包含我所有的 fragment 。每次选择一个选项卡时,我只会在 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 并拦截滑动触摸 Action 来禁用滑动。

关于android - 如何在不每次都重新加载 fragment 的情况下在操作栏选项卡之间平滑切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13700502/

相关文章:

android - Sencha 原生包装与 android

Android 如何通过程序卸载SD卡?

php - 如何使用 MySQL 将值从一个微调器获取到另一个微调器?

android如何使表随着值变长而自行扩展

android -/sdcard上的音乐文件是否进入apk?

android - 将图像从 Android 发送到 WCF

java - 如何向在 Marshmallow 上运行的 Android 应用程序授予权限?

android - 单击任何 subview 时,父 View 的选择器不起作用

java - android 如何获取当前的日期和时间

android - 如何删除 SQLite 数据库中的特定行