启用/禁用ActionBar中的选项卡

6
可以在ActionBar中启用/禁用选项卡吗? 使用TabHost不是问题。我这样做:
tabHost.getTabWidget().getChildAt(3).setVisibility(true);

所有的工作都正常运行...但如果我想在ActionBar中使用选项卡来做同样的事情呢?在Tab类中并不存在setEnable();方法。

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

我该怎么做?
6个回答

7

1
这不是同一件事...我不想删除然后重新添加...我只想启用/禁用...我希望选项卡仍然出现在布局中!感谢您的回答。 - Babez21584
我在新答案中发布了另一个建议。看一下吧。 - kaspermoerch

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.setTabListener( new MyTabListener() );

启用/禁用

要启用或禁用一个选项卡,我们只需调用:

tabHolder.getTab( position ).toggleEnabled();

让我知道进展如何 :)

这个怎样与 ActionBar 结合使用? - DDD
你可以调用 tabHolder.getTab(position).getTab() 方法来获取选项卡,然后将其添加到 ActionBar。 - kaspermoerch
但是ActionBar.addTab需要一个ActionBar.Tab,而TabItem与之不兼容。 - DDD
在TabItem上调用getTab方法应该会给你一个ActionBar.Tab的实例。 - kaspermoerch
是的,但这并不能帮助你使用其中一个 TabItems,不是吗? - DDD

3

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

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);

这将移除任何选项卡栏。

actionbar.removeAllTabs() - Sagar Devanga

0

您可以重写以下方法:public boolean onPrepareOptionsMenu(Menu menu),在此处设置选项卡的启用/禁用状态,例如:

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

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


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());

工作示例。http://suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/ - Suhas Patil

0

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

1- 禁用功能:避免更改选项卡

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

2- 禁用点击事件:

    public void setModifyMode(boolean modifyMode) {
        mModifyMode = modifyMode;
        for (int i = 0; i < mActionBar.getTabCount(); i++) {
            View parent = (View) mActionBar.getTabAt(i).getCustomView().getParent();
            parent.setEnabled(mModifyMode);
        }
    }

我刚刚测试了一下,它可以工作;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接