2012-07-21 94 views
0

我正在使用片段并创建了一个带3个选项卡的tabhost,并在第一个选项卡中放置了一个按钮。我的问题是,我可以更改为我创建的按钮的第二个选项卡吗?这里是我的代码:切换选项卡中的按钮

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; 
     } 

    } 

    /** 
    * 
    * @author mwho 
    * 
    */ 
    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); 
      return v; 
     } 

    } 

    /** 
    * (non-Javadoc) 
    * 
    * @see android.support.v4.app.FragmentActivity#onCreate(android.os.Bundle) 
    */ 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tabs_layout); 
     initialiseTabHost(savedInstanceState); 
     if (savedInstanceState != null) { 
      mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); // set 
                       // the 
                       // tab 
                       // as 
                       // per 
                       // the 
                       // saved 
                       // state 
     } 
    } 

    /** 
    * (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 the Tab Host 
    */ 
    private void initialiseTabHost(Bundle args) { 
     mTabHost = (TabHost) findViewById(android.R.id.tabhost); 
     mTabHost.setup(); 
     TabInfo tabInfo = null; 
     ElastoTabsActivity.addTab(this, this.mTabHost, this.mTabHost 
       .newTabSpec("Tab1").setIndicator("Home"), 
       (tabInfo = new TabInfo("Tab1", HomeTab.class, args))); 
     this.mapTabInfo.put(tabInfo.tag, tabInfo); 
     ElastoTabsActivity.addTab(this, this.mTabHost, this.mTabHost 
       .newTabSpec("Tab2").setIndicator("Taping Prep"), 
       (tabInfo = new TabInfo("Tab2", Tab2Fragment.class, args))); 
     this.mapTabInfo.put(tabInfo.tag, tabInfo); 
     ElastoTabsActivity.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); 
    } 

    /** 
    * @param activity 
    * @param tabHost 
    * @param tabSpec 
    * @param clss 
    * @param args 
    */ 
    private static void addTab(ElastoTabsActivity activity, TabHost tabHost, 
      TabHost.TabSpec tabSpec, TabInfo tabInfo) { 
     // Attach a Tab view factory to the spec 
     tabSpec.setContent(activity.new TabFactory(activity)); 
     String tag = tabSpec.getTag(); 

     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     tabInfo.fragment = activity.getSupportFragmentManager() 
       .findFragmentByTag(tag); 
     if (tabInfo.fragment != null && !tabInfo.fragment.isDetached()) { 
      FragmentTransaction ft = activity.getSupportFragmentManager() 
        .beginTransaction(); 
      ft.detach(tabInfo.fragment); 
      ft.commit(); 
      activity.getSupportFragmentManager().executePendingTransactions(); 
     } 

     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); 
     if (mLastTab != newTab) { 
      FragmentTransaction ft = this.getSupportFragmentManager() 
        .beginTransaction(); 
      if (mLastTab != null) { 
       if (mLastTab.fragment != null) { 
        ft.detach(mLastTab.fragment); 
       } 
      } 
      if (newTab != null) { 
       if (newTab.fragment == null) { 
        newTab.fragment = Fragment.instantiate(this, 
          newTab.clss.getName(), newTab.args); 
        ft.add(R.id.realtabcontent, newTab.fragment, newTab.tag); 
       } else { 
        ft.attach(newTab.fragment); 
       } 
      } 

      mLastTab = newTab; 
      ft.commit(); 
      this.getSupportFragmentManager().executePendingTransactions(); 
     } 
    } 

谢谢!

+0

听起来可能。你尝试了什么?我在代码中看不到任何按钮点击。 – Erol 2012-07-22 02:50:19

+0

对不起。事情是我在与第一个选项卡相关联的片段中创建了按钮,并且您知道我很难在活动/片段之间切换。据我所知,这一次我不能使用意图在片段之间切换,因为片段不会以这种方式运行,对吧? – 2012-07-22 03:00:12

回答

0

在编写代码之前,您是否有机会阅读TabHost documentary?因为您已在代码中使用a function来更改选项卡。

你唯一需要做的就是在你的按钮的onClick监听器中实现它。如果你不知道如何处理按钮点击,网络上有很多例子。

+0

如果我太困扰你,我很抱歉。我已经阅读了纪录片,唯一不理解的是如何从另一个片段(包含按钮的片段)调用函数setCurrentTab(index)。非常感谢btw。 – 2012-07-22 06:15:36

+0

这是一个TabHost的功能,所以你需要使用你的TabHost对象。 – Erol 2012-07-22 06:25:56

+0

这听起来像你没有自己写上面的代码。我建议你在提问关于更详细的事情之前,先研究你在这里发布的代码。 – Erol 2012-07-22 06:38:01