2012-05-07 192 views
0

我試圖避免使用tabhost內的意圖和活動,並tabwidget Android的標籤互動觀點

此代碼開始變得凌亂只是使用視圖的一切。

我的問題是我很難保留信息。在一個選項卡中,我有一個視圖有4個按鈕,每個按鈕都會加載另一個視圖,並在該選項卡的屏幕上顯示視覺信息。問題是,當我「返回」加載該選項卡中的前一個視圖時,沒有任何信息是該視圖被保留,即使按鈕偵聽器也不會重新實例化。

我該如何解決這個問題?我已經看到了選項卡中的一些非常基本的視圖示例,但沒有任何交互式視圖載入更多視圖。

(viewflippers和行動酒吧不是一種選擇,我試圖避免使用卡口與活動)

回答

2

忘記活動組。忘記標籤主機。這一切都是關於ActionBar Tabs和ViewPager Fragments。 API Demos示例應用程序(也是Android兼容庫示例應用程序)提供了一個將Tab和ViewPager導航結合在Fragments之間的實現,但它對Tabs(即它們不是真正的ActionBar選項卡)進行了虛假的排序。請參閱FragmentTabsPager.java。你可以把它和真正的ActionBar標籤一起使用。

這是有趣的一點。 (我刪除了一堆東西,所以不要找一個完整的工作解決方案在這裏。)

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.fragment_tabs_pager); 

    mViewPager = (ViewPager)findViewById(R.id.pager); 

    // This block thanks to https://stackoverflow.com/q/9790279/517561 
    ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    bar.setDisplayShowTitleEnabled(true); 
    bar.setDisplayShowHomeEnabled(true); 
    // 

    mTabsAdapter = new TabsAdapter(this, mViewPager); 

    mTabsAdapter.addTab("simple", "Simple", 
      FragmentStackSupport.CountingFragment.class, null); 
    mTabsAdapter.addTab("contacts", "Contacts", 
     LoaderCursorSupport.CursorLoaderListFragment.class, null); 
    mTabsAdapter.addTab("custom", "Custom", 
     LoaderCustomSupport.AppListFragment.class, null); 
    mTabsAdapter.addTab("throttle", "Throttle", 
     LoaderThrottleSupport.ThrottledLoaderListFragment.class, null); 
} 

public static class TabsAdapter extends FragmentPagerAdapter 
     implements ViewPager.OnPageChangeListener, ActionBar.TabListener { 
    private final SherlockFragmentActivity mContext; 
    private final ViewPager mViewPager; 
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

    static final class TabInfo { 
     @SuppressWarnings("unused") 
     private final String tag; 
     private final Class<?> clss; 
     private final Bundle args; 

     TabInfo(String _tag, Class<?> _class, Bundle _args) { 
      tag = _tag; 
      clss = _class; 
      args = _args; 
     } 
    } 

    static class DummyTabFactory implements TabHost.TabContentFactory { 
     private final Context mContext; 

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

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

    public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mViewPager = pager; 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(String tag, CharSequence label, Class<?> clss, Bundle args) { 
     ActionBar.Tab tab = mContext.getSupportActionBar().newTab(); 
     tab.setText(label); 
     tab.setTabListener(this); 
     mContext.getSupportActionBar().addTab(tab); 
     TabInfo info = new TabInfo(tag, clss, args); 
     mTabs.add(info); 
     notifyDataSetChanged();  
    } 

    @Override 
    public Fragment getItem(int position) { 
     TabInfo info = mTabs.get(position); 
     return Fragment.instantiate(mContext, info.clss.getName(), info.args); 
    } 

    @Override 
    public void onPageSelected(int position) { 
     mContext.getSupportActionBar().setSelectedNavigationItem(position); 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     mViewPager.setCurrentItem(mContext.getSupportActionBar().getSelectedNavigationIndex()); 
    } 
} 

我的完整的解決方案:http://code.google.com/p/sherlock-demo/

注:需要ActionBarSherlock。 注意:感謝ActionBarSherlock and FragmentTabsPager

+0

沒關係,現在給我一個適用於Android 2.2+的實現,並在屏幕底部有tab /「actionbars」選項卡。接受挑戰? – CQM

+0

在我的android 2.3.3手機上,一半的android v4支持示例類崩潰,出現「ClassNotFoundException」 – CQM

+0

請參閱已更新答案中的解決方案。沒有手機,但運行在2.1 AVD。 – Sparky