【问题标题】:Enable/Disable Tab in ActionBar在 ActionBar 中启用/禁用选项卡
【发布时间】:2011-11-17 09:44:05
【问题描述】:

可以启用/禁用 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!!*/

我该怎么办??

【问题讨论】:

    标签: android tabs android-actionbar


    【解决方案1】:

    你可以使用ActionBarremoveTab( ActionBar.Tab tab )-方法:

    bar.removeTab( tab );
    

    然后使用addTab( ActionBar.Tab tab, int position ) 将其放回原处,前提是您保存您删除的Tab 的位置:

    bar.addTab( tab, savedTabPosition );
    

    【讨论】:

    • 这不是一回事..我不想删除然后重新添加...我只会让它启用/禁用...我希望标签仍然出现在布局!感谢您的回答
    • 我在新答案中发布了另一个建议。看看吧。
    【解决方案2】:

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

    分为三个步骤:

    第一步

    我们需要一些可以为我们处理启用/禁用操作的东西。为此,我们创建了以下类:

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

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

    tab.setTabListener( new MyTabListener() );
    

    启用/禁用

    要启用或禁用Tab,我们只需调用:

    tabHolder.getTab( position ).toggleEnabled();
    

    让我知道进展如何:)

    【讨论】:

    • 如何与 ActionBar 结合?
    • 您调用 tabHolder.getTab(position).getTab() 来获取选项卡,然后将其添加到 ActionBar。
    • 但是 ActionBar.addTab 需要一个 ActionBar.Tab,与 TabItem 不兼容。
    • 在 TabItem 上调用 getTab 方法应该会给你一个 ActionBar.Tab 的实例。
    • 是的,但这并不能帮助您使用这些 TabItem 之一吗?
    【解决方案3】:

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

    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    

    这将删除所有标签栏。

    【讨论】:

    • actionbar.removeAllTabs()
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

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

      如果你像往常一样使用@987654321@,你可以像这样简单地利用它的位置而不是mLastSelectedTabIndex

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

      【讨论】:

      【解决方案6】:

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

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

      我现在对其进行了测试,它正在工作;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2013-01-07
        • 1970-01-01
        相关资源
        最近更新 更多