2013-01-13 106 views
1

我目前正在開發一個android項目,並已創建一個測試項目以測試使用Tab和通過使用水平輕掃手勢更改標籤。使用水平滑動切換標籤

除了一個問題,代碼幾乎可以工作。當我滑動內容以更改選項卡時,會顯示第二個選項卡的活動,但實際選項卡未選中。即在Android 4.2上,當應用程序加載時,它啓動主FragmentActivity,然後顯示第一個片段(片段1),它位於選項卡1的內部。選項卡1然後在下面有一條藍線,以顯示該選項卡被選中。

如果我再輕掃屏幕,第二活性顯示,但藍線保持標籤下的1和跨不會移動到標籤2.

但是,如果我選擇實際的標籤,而不是刷卡的再如預期的那樣,藍線會移動到第二個選項卡上。

我懷疑我錯過了一些非常簡單的東西,從我正在看的教程,但我無法找到我的生活可能是什麼。

下面是我爲FragmentActivity的代碼。這是應用第一次啓動時加載的內容。

public class TabsViewPagerFragmentActivity extends FragmentActivity 
    implements OnTabChangeListener, OnPageChangeListener{ 

    private TabHost mTabHost; 
    private ViewPager mViewPager; 
    private HashMap<String, TabInfo> mapTabInfo = new HashMap<String, TabInfo>(); 
    private PagerAdapter mPagerAdapter; 

    private class TabInfo 
    { 
     private String tag; 
     private Class<?> clss; 
     private Bundle bundle; 
     private Fragment fragment; 
     public TabInfo(String tag, Class<?> clss, Bundle bundle) { 
      this.tag = tag; 
      this.clss = clss; 
      this.bundle = bundle; 
     } 
    } 

    class TabFactory implements TabContentFactory 
    { 
     private final Context mContext; 

     public TabFactory (Context context) 
     { 
      mContext = context; 
     } 

     public View createTabContent(String tag) 
     { 
      View view = new View(mContext); 
      view.setMinimumWidth(0); 
      view.setMinimumHeight(0); 
      return view; 
     } 
    } 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     this.initialiseTabHost(savedInstanceState); 
     if (savedInstanceState != null) 
     { 
      mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
     } 
     this.initialiseViewPager(); 
    } 

    protected void onSaveInstancestate(Bundle outState) 
    { 
     outState.putString("tab", mTabHost.getCurrentTabTag()); 
     super.onSaveInstanceState(outState); 
    } 

    private void initialiseViewPager() 
    { 
     List<Fragment> fragments = new Vector<Fragment>(); 
     fragments.add(Fragment.instantiate(this, Tab1Fragment.class.getName())); 
     fragments.add(Fragment.instantiate(this, Tab2Fragment.class.getName())); 
     this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager(), fragments); 
     this.mViewPager = (ViewPager)super.findViewById(R.id.viewpager); 
     this.mViewPager.setAdapter(this.mPagerAdapter); 
     this.mViewPager.setOnPageChangeListener(this); 
    } 

    private void initialiseTabHost(Bundle bundle) 
    { 
     mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(); 
     TabInfo tabInfo = null; 
     TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, 
       this.mTabHost.newTabSpec("Tab 1").setIndicator("Tab 1"), 
       tabInfo = new TabInfo("Tab1", Tab1Fragment.class, bundle)); 
     TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, 
       this.mTabHost.newTabSpec("Tab 2").setIndicator("Tab 2"), 
       tabInfo = new TabInfo("Tab2", Tab2Fragment.class, bundle)); 

     this.mapTabInfo.put(tabInfo.tag, tabInfo); 
     mTabHost.setOnTabChangedListener(this); 
    } 

    private static void AddTab(TabsViewPagerFragmentActivity activity, TabHost tabHost, 
      TabHost.TabSpec tabSpec, TabInfo tabInfo) 
    { 
     tabSpec.setContent(activity.new TabFactory(activity)); 
     tabHost.addTab(tabSpec); 
    } 

    @Override 
    public void onPageScrollStateChanged(int arg0) { 

    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, 
      int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageSelected(int position) { 
     this.mViewPager.setCurrentItem(position); 
    } 

    @Override 
    public void onTabChanged(String tag) { 
     int pos = this.mTabHost.getCurrentTab(); 
     this.mViewPager.setCurrentItem(pos); 
    } 
} 

下面是對PageAdapter代碼

public class PagerAdapter extends FragmentPagerAdapter { 

    private List<Fragment> fragments; 

    public PagerAdapter(FragmentManager fm, List<Fragment> fragments) 
    { 
     super(fm); 
     this.fragments = fragments; 
    } 

    public int getCount() 
    { 
     return this.fragments.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return this.fragments.get(position); 
    } 
} 

感謝您的幫助,您可以提供。

回答

1

mTabHost.setCurrentTab(position)添加到您的FragmentActivity中的onPageSelected()方法中。

+0

感謝您的幫助,現在完美工作 – Boardy