首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在操作栏选项卡之间顺利切换,而不每次重新加载片段

如何在操作栏选项卡之间顺利切换,而不每次重新加载片段
EN

Stack Overflow用户
提问于 2012-12-04 10:13:04
回答 1查看 3.2K关注 0票数 1

下面的操作条选项卡实现方法是否有效?因为每当我在制表符之间切换时,Tab内容片段就会被替换,并在框架布局中再次加载。

我希望第一次添加片段本身,并在切换选项卡时平稳地显示片段(不需要重新加载)。

注意:我尝试在onCreate method.But上添加所有片段,片段相互重叠,同时显示帧布局中的所有片段。

我的代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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内容是清单片段,它使用加载器管理器从Sqlite查询数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-04 10:24:35

我使用一个包含所有片段的ViewPager。每次选择选项卡时,我只切换查看器中的位置。

代码语言:javascript
复制
   @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中。我使用FragmentPagerAdapter,因为大多数时候没有那么多选项卡。

这也使您的用户可以滑动通过选项卡。如果用户通过滑动更改所选选项卡,则需要更新所选选项卡。我在所有的应用程序中都使用ActionBarSherlock。因此,下一个片段使用一个supportActionBar。此代码示例是一个简单的侦听器,可以在ViewPager上设置,通过滑动更新选项卡更改。

代码语言:javascript
复制
   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和拦截滑动触摸动作来禁用滑动。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13700502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档