2013-03-19 127 views
0

我实现了一个ViewPagerTab使用本教程S:更改ViewPager选项卡ImageViews:

http://thepseudocoder.wordpress.com/2011/10/13/android-tabs-viewpager-swipe-able-tabs-ftw/

它的工作原理如我所料,但现在我需要点击ImageView s到更换Tab S,有没有简单的方法来做到这一点?

这是当前的结果:

enter image description here

这是我当前的代码:

TabsViewPagerFragmentActivity:

public class TabsViewPagerFragmentActivity extends FragmentActivity implements 
ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener 
{ 
static final String TAG = "TabsActivity"; 
private TabHost mTabHost; 
private ViewPager mViewPager; 
private HashMap<String, TabInfo> mapTabInfo = new HashMap<String, TabsViewPagerFragmentActivity.TabInfo>(); 
private ViewPagerAdapter mPagerAdapter; 


/** 
* Maintains extrinsic info of a tab's construct 
*/ 
private class TabInfo 
{ 
    private String tag; 
    private Class<?> clss; 
    private Bundle args; 
    private Fragment fragment; 

    TabInfo(String tag, Class<?> clazz, Bundle args) 
    { 
     this.tag = tag; 
     this.clss = clazz; 
     this.args = args; 
    } 
} 

/** 
* A simple factory that returns dummy views to the Tabhost 
*/ 
class TabFactory implements TabContentFactory { 

    private final Context mContext; 

    /** 
    * @param context 
    */ 
    public TabFactory(Context context) { 
     mContext = context; 
    } 

    /** (non-Javadoc) 
    * @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String) 
    */ 
    public View createTabContent(String tag) { 
     View v = new View(mContext); 
     v.setMinimumWidth(0); 
     v.setMinimumHeight(0); 
     v.setBackgroundResource(R.drawable.free_text_save_button_selector); 
     return v; 
    } 
} 

/** (non-Javadoc) 
* @see android.support.v4.app.FragmentActivity#onCreate(android.os.Bundle) 
*/ 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    // Inflate the layout 
    setContentView(R.layout.tabs_screen_activity_layout); 
    // Initialise the TabHost 
    this.initialiseTabHost(savedInstanceState); 

    if (savedInstanceState != null) { 
     mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); //set the tab as per the saved state 
    } 
    // Intialise ViewPager 
    this.intialiseViewPager(); 
} 


/** (non-Javadoc) 
* @see android.support.v4.app.FragmentActivity#onSaveInstanceState(android.os.Bundle) 
*/ 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putString("tab", mTabHost.getCurrentTabTag()); //save the tab selected 
    super.onSaveInstanceState(outState); 
} 

/** 
* Initialise ViewPager 
*/ 
private void intialiseViewPager() { 

    List<Fragment> fragments = new Vector<Fragment>(); 

    fragments.add(Fragment.instantiate(this, Tab1Fragment.class.getName())); 
    fragments.add(Fragment.instantiate(this, Tab2Fragment.class.getName())); 
    fragments.add(Fragment.instantiate(this, Tab3Fragment.class.getName())); 

    this.mPagerAdapter = new ViewPagerAdapter(super.getSupportFragmentManager(), fragments); 
    this.mViewPager = (ViewPager)super.findViewById(R.id.pager); 
    this.mViewPager.setAdapter(this.mPagerAdapter); 
    this.mViewPager.setOnPageChangeListener(this); 
} 

/** 
* Initialise the Tab Host 
*/ 
private void initialiseTabHost(Bundle args) { 
    mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
    mTabHost.setup(); 
    TabInfo tabInfo = null; 
    TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab1").setIndicator("Tab 1"), (tabInfo = new TabInfo("Tab1", Tab1Fragment.class, args))); 
    this.mapTabInfo.put(tabInfo.tag, tabInfo); 
    TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab2").setIndicator("Tab 2"), (tabInfo = new TabInfo("Tab2", Tab2Fragment.class, args))); 
    this.mapTabInfo.put(tabInfo.tag, tabInfo); 
    TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab3").setIndicator("Tab 3"), (tabInfo = new TabInfo("Tab3", Tab3Fragment.class, args))); 
    this.mapTabInfo.put(tabInfo.tag, tabInfo); 
    // Default to first tab 
    //this.onTabChanged("Tab1"); 
    // 
    mTabHost.setOnTabChangedListener(this); 
} 

/** 
* Add Tab content to the Tabhost 
* @param activity 
* @param tabHost 
* @param tabSpec 
* @param clss 
* @param args 
*/ 
private static void AddTab(TabsViewPagerFragmentActivity activity, TabHost tabHost, TabHost.TabSpec tabSpec, TabInfo tabInfo) { 
    // Attach a Tab view factory to the spec 
    tabSpec.setContent(activity.new TabFactory(activity)); 
    tabHost.addTab(tabSpec); 
} 

/** (non-Javadoc) 
* @see android.widget.TabHost.OnTabChangeListener#onTabChanged(java.lang.String) 
*/ 
public void onTabChanged(String tag) { 
    //TabInfo newTab = this.mapTabInfo.get(tag); 
    int pos = this.mTabHost.getCurrentTab(); 
    this.mViewPager.setCurrentItem(pos); 
} 

/* (non-Javadoc) 
* @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrolled(int, float, int) 
*/ 
@Override 
public void onPageScrolled(int position, float positionOffset, 
     int positionOffsetPixels) { 
    // TODO Auto-generated method stub 

} 

/* (non-Javadoc) 
* @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageSelected(int) 
*/ 
@Override 
public void onPageSelected(int position) { 
    // TODO Auto-generated method stub 
    this.mTabHost.setCurrentTab(position); 
} 

/* (non-Javadoc) 
* @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrollStateChanged(int) 
*/ 
@Override 
public void onPageScrollStateChanged(int state) { 
    // TODO Auto-generated method stub 

} 
} 

ViewPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter 
{ 
private List<Fragment> fragments; 

/** 
* @param fm 
* @param fragments 
*/ 
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
    super(fm); 
    this.fragments = fragments; 
} 

/* (non-Javadoc) 
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int) 
*/ 

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

/* (non-Javadoc) 
* @see android.support.v4.view.PagerAdapter#getCount() 
*/ 

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

任何帮助,将不胜感激,谢谢。

回答

2

您可以将任何视图添加到您的Tabhost如下 -

 TabSpec tabSpec = mTabHost.newTabSpec("Tag"); 
     ImageView indicator = new ImageView(activity.getBaseContext()); 
     indicator.setImageResource(R.id.tab_img); 

     tabSpec.setIndicator(indicator); 
     tabSpec.setContent(activity.new TabFactory(activity)); 
     mTabHost.addTab(tabSpec); 

记住要一个选择,如果你想更改选定和正常状态下的可绘为好。

+0

谢谢你的回答。我为这个愚蠢的问题感到抱歉。这是我第一次使用ViewPager,请你解释一下这段代码应该放在我发布的代码中的位置? – 2013-03-19 13:32:00

+0

嗯,我已经想通了,谢谢你的帮助。 – 2013-03-19 14:59:44

+0

我很抱歉没有及时回复。我很高兴我能帮助你.. :-) – 2013-03-19 16:57:59

相关问题