在ActionBar中启用/禁用选项卡

时间:2011-11-17 09:44:05

标签: android tabs android-actionbar

可以在ActionBar中启用/禁用Tabs吗? 使用TabHost这不是问题..我这样做:

tabHost.getTabWidget().getChildAt(3).setVisibility(true);

并且所有工作..但是如果我想在ActionBar中用Tabs做同样的事情? 在Tab类中不存在setEnable();

ActionBar bar = getActionBar();
Tab tab =  bar.newTab();
tab.setText("Test");
tab.setEnable(false); /*DON'T EXIST!!*/

我该怎么办?

6 个答案:

答案 0 :(得分:7)

您可以使用ActionBar的{​​{1}}方法:

bar.removeTab( tab );

然后使用removeTab( ActionBar.Tab tab )将其重新插入,只要您保存已移除的Tab的位置:

bar.addTab( tab, savedTabPosition );

答案 1 :(得分:4)

我没有对此进行测试 - 这取决于您,但它应该让您对如何处理问题有一个大概的了解。

有三个步骤:

第一步

我们需要能够为我们处理启用/禁用操作的内容。为此,我们创建了以下类:

public class TabItem {
  private Tab tab;
  private Fragment fragment;
  private boolean enabled;

  public TabItem( Tab tab, Fragment fragment ) {
    this.tab = tab;
    this.fragment = fragment;
    enabled = true;
  }

  public Tab getTab() {
    return tab;
  }

  public Fragment getFragment() {
    return fragment;
  }

  public void toggleEnabled() {
    enabled = enabled ? false : true;
  }

  public boolean isEnabled() {
    return enabled;
  }
} 

第二步

我们需要一些可以容纳这些TabItems的东西,并且可以轻松访问它们。为此,我们添加以下类:

public class TabHolder {
  private HashMap<Integer, TabItem> tabs;

  public TabHolder() {
    tabs = new HashMap<Integer, TabItem>();
  }

  public void addTab( TabItem tab ) {
    tabs.put( tab.getTab().getPosition(), tab );
  }

  public TabItem getTab( int position ) {
    return tabs.get( position );
  }
}

第三步

我们需要自己处理Tabs的选择,因此我们需要创建自定义TabListener

private class MyTabListener implements TabListener {
  @Override
  public void onTabReselected( Tab tab, FragmentTransaction ft ) {
    //Do nothing - unless you want to do something.
  }

  @Override
  public void onTabSelected( Tab tab, FragmentTransaction ft ) {
    TabItem item = tabHolder.getTab( tab.getPosition() );
    if( item.isEnabled() ) {
      ft.remove( item.getFragment() );
      ft.commit();
    }        
  }

  @Override
  public void onTabUnselected( Tab tab, FragmentTransaction ft ) {
    //Do nothing - unless you want to do something.        
  } 
}

<强>最后

我们现在可以利用我们创建的框架。为此,我们需要TabHolder

tabHolder = new TabHolder(); //Needs to be declared in the same class as our TabListener

我们需要将Tabs添加到此处:

tabHolder.addTab( new TabItem( tab, fragmentForThisTab ) );

我们需要在每个TabListener上设置自定义Tab

tab.setTabListener( new MyTabListener() );

启用/禁用

要启用或停用Tab,我们只需致电:

tabHolder.getTab( position ).toggleEnabled();

让我知道它是怎么回事:))

答案 2 :(得分:3)

有一种简单的方法可以从操作栏中删除选项卡栏。只需输入:

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);

这将删除所有标签栏。

答案 3 :(得分:0)

你可以覆盖:   public boolean onPrepareOptionsMenu(Menu menu),在此处设置选项卡启用/禁用,例如:

menu.findItem(R.id.send).setEnabled(mMessageNeedtoSend);

然后您可以设置mMessageNeedtoSend true或false,调用invalidateOptionsMenu()来刷新ActionBar。

答案 4 :(得分:0)

迟到的答案,但希望这种解决方法可以帮助其他对此问题感兴趣的人。

private Handler mHandler;
private int mLastSelectedTabIndex = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    mHandler = new Handler();

    // ...

    ActionBar bar = getActionBar();

    Tab tab = bar.newTab().setText("Enabled Tab")
            .setTabListener(mTabListener);
    bar.addTab(tab);

    tab = bar.newTab().setText("Disabled Tab")
            .setTabListener(mTabListener);
    bar.addTab(tab);
}

private TabListener mTabListener = new TabListener() {
    // ...

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        int position = tab.getPosition();
        if (position == 1) {
            // Disabled tabs are selected.

            mHandler.postAtFrontOfQueue(new Runnable() {
                @Override
                public void run() {
                    getActionBar().setSelectedNavigationItem(
                            mLastSelectedTabIndex);
                }
            });
        } else {
            // Enabled tabs are selected. Do something on your own.

            mLastSelectedTabIndex = position;
        }
    }

    // ...
};

如果您像往常一样使用ViewPager,则只需使用其位置而不是mLastSelectedTabIndex,如下所示:

getActionBar().setSelectedNavigationItem(mViewPager.getCurrentItem());

答案 5 :(得分:0)

这是通过两个简单步骤完成的(假设您为选项卡设置了自定义视图):

1-禁用功能:避免更改标签

.kcm

2-禁用点击事件:

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        int position = tab.getPosition();
        if (mModifyMode) {
            mPagerAdapter.changeFragment(position);
        }
    }

我现在测试它并且它正在工作;)