【问题标题】:tab contents using actionbarsherlock tab style使用 actionbarsherlock 选项卡样式的选项卡内容
【发布时间】:2012-04-20 10:05:02
【问题描述】:

参考下面这段代码(取自https://gist.github.com/1126843)我如何设置标签的内容?

public class NativeTabActivity extends Activity {
    private TabHost mTabHost;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mTabHost = (TabHost)findViewById(android.R.id.tabhost);
        mTabHost.setup();

        addTab(new TextView(this), "Tab 1");
        addTab(new TextView(this), "Tab 2");
        addTab(new TextView(this), "Tab 3");
    }

    private void addTab(final View content, final String title) {
        View tabView = LayoutInflater.from(this).inflate(R.layout.abs__action_bar_tab_layout, null);
        TextView tv = (TextView) tabView.findViewById(R.id.abs__tab);
        tv.setText(title);

        TabSpec setContent = mTabHost.newTabSpec(title).setIndicator(tabView).setContent(new TabContentFactory() {
            public View createTabContent(String tag) {
                return content;
            }
        });
        mTabHost.addTab(setContent);
    }
}

从代码看来,我需要将内容放在 View createTabContent(String tag) 下,但我该怎么做呢?

【问题讨论】:

    标签: android actionbarsherlock


    【解决方案1】:

    我发现 Rymnel 的回答非常有帮助,但我必须进行一些更改才能使其与 ActionBarSherlock 4.0 一起正常工作。我在重写传入 FragmentTransactions 的 onTab 方法时遇到问题,所以我只使用了默认方法并在方法内重新分配了“ft”var。我确信有一种更简洁的方法可以做到这一点,但这是我的工作代码:

    public class TabTestActivity extends SherlockFragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        ActionBar bar = getSupportActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
        bar.setDisplayHomeAsUpEnabled(true);
        bar.setDisplayShowTitleEnabled(true);
        bar.setTitle("Activity Title");
        bar.addTab(bar
                .newTab()
                .setText("Tab 1")
                .setTabListener(
                        new TabListener<TabTest1>(this, "tab1",
                                TabTest1.class, null)));
    
        bar.addTab(bar
                .newTab()
                .setText("Tab 2")
                .setTabListener(
                        new TabListener<TabTest2>(this, "tab2",
                                TabTest2.class, null)));
        bar.addTab(bar
                .newTab()
                .setText("Tab 3")
                .setTabListener(new TabListener<TabTest3>(this, "tab3", TabTest3.class, null)));
    
        if (savedInstanceState != null) {
            bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
        }
    
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; go home
                        Intent intent = new Intent(this, DashboardActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(intent);
                        return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("tab", getSupportActionBar()
                .getSelectedNavigationIndex());
    }
    
    public class TabListener<T extends Fragment> implements
            ActionBar.TabListener {
        private final FragmentActivity mActivity;
        private final String mTag;
        private final Class<T> mClass;
        private final Bundle mArgs;
        private Fragment mFragment;
    
        public TabListener(FragmentActivity activity, String tag, Class<T> clz,
                Bundle args) {
            mActivity = activity;
            mTag = tag;
            mClass = clz;
            mArgs = args;
            FragmentTransaction ft = mActivity.getSupportFragmentManager()
                    .beginTransaction();
    
            // 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.
            mFragment = mActivity.getSupportFragmentManager()
                    .findFragmentByTag(mTag);
            if (mFragment != null && !mFragment.isDetached()) {
                ft.detach(mFragment);
            }
        }
    
    
        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            ft = mActivity.getSupportFragmentManager()
                    .beginTransaction();
    
            if (mFragment == null) {
                mFragment = Fragment.instantiate(mActivity, mClass.getName(),
                        mArgs);
                ft.add(android.R.id.content, mFragment, mTag);
                ft.commit();
            } else {
                ft.attach(mFragment);
                ft.commit();
            }
    
        }
    
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            ft = mActivity.getSupportFragmentManager()
                    .beginTransaction();
    
            if (mFragment != null) {
                ft.detach(mFragment);
                ft.commitAllowingStateLoss();
            }
    
        }
    
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
        }
    }
    

    【讨论】:

      【解决方案2】:

      我将 Fragments 用于我的 Sherlock 实现。

      public class ActionBarTabs extends FragmentActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
          ActionBar bar = getSupportActionBar();
          bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
          bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
      
          bar.addTab(bar.newTab()
                  .setText("Home")
                  .setTabListener(new TabListener<DashBoardFragment>(
                          this, "home", DashBoardFragment.class, null)));
      
          bar.addTab(bar.newTab()
                  .setText("Inventory")
                  .setTabListener(new TabListener<InventoryFragment>(
                          this, "inventory", InventoryFragment.class, null)));
      
      if (savedInstanceState != null) {
      
              bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
          }
      
      
      }
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
              case android.R.id.home:
                  // app icon in action bar clicked; go Location selection
                  Intent intent = new Intent(ActionBarTabs.this, LocationSelectorActivity.class);
                  ActionBarTabs.this.startActivityForResult(intent,0);
                  return true;
              default:
                  return super.onOptionsItemSelected(item);
          }
      }
      
      @Override
      protected void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
          outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex());
      }
      
      public class TabListener<T extends Fragment> implements ActionBar.TabListener {
          private final FragmentActivity mActivity;
          private final String mTag;
          private final Class<T> mClass;
          private final Bundle mArgs;
          private Fragment mFragment;
      
      
      
      
          public TabListener(FragmentActivity activity, String tag, Class<T> clz, Bundle args) {
              mActivity = activity;
              mTag = tag;
              mClass = clz;
              mArgs = args;
              FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
      
      
              // 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.
              mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
              if (mFragment != null && !mFragment.isDetached()) {
                  ft.detach(mFragment);
              }
          }
      
          @Override
          public void onTabSelected(Tab tab) {
              FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
      
              if (mFragment == null) {
                  mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
                  ft.add(android.R.id.content, mFragment, mTag);
                  ft.commit();
              } else {
                  ft.attach(mFragment);
                  ft.commit();
              }
          }
      
          @Override
          public void onTabUnselected(Tab tab) {
              FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
      
              if (mFragment != null) {
                  ft.detach(mFragment);
                  ft.commitAllowingStateLoss();
              }           
          }
      
          @Override
          public void onTabReselected(Tab tab) {
      
          }
      
      }
      
      }
      

      将不同片段加载到选项卡中的关键更改是在以下几行中将“YOUR_FRAGMENT_NAME”简单地更改为片段类的名称:

      bar.addTab(bar.newTab()
                  .setText("Home")
                  .setTabListener(new TabListener<YOUR_FRAGMENT_NAME>(
                          this, "home", YOUR_FRAGMENT_NAME.class, null)));
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多