Включить / отключить вкладку в ActionBar - PullRequest
6 голосов
/ 17 ноября 2011

Возможно ли включить / отключить вкладки в ActionBar?С TabHost это не проблема .. Я делаю:

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

и все работает .. но если я хочу сделать то же самое с вкладками в ActionBar ??В закладке класс не существует setEnable();

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

Как мне это сделать ??

Ответы [ 6 ]

7 голосов
/ 17 ноября 2011

Вы можете использовать removeTab( ActionBar.Tab tab ) -метод ActionBar:

bar.removeTab( tab );

А затем используйте addTab( ActionBar.Tab tab, int position ), чтобы вернуть его обратно, при условии сохранения позиции удаленного Tab:

bar.addTab( tab, savedTabPosition );
4 голосов
/ 21 ноября 2011

Я не проверял это - это будет зависеть от вас, но это должно дать вам общее представление о том, как вы можете решить вашу проблему.

Есть три шага:

Первый шаг

Нам нужно что-то, что может обработать действие включения / выключения для нас. Для этого мы создаем следующий класс:

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

Дайте мне знать, как оно идет:)

3 голосов
/ 21 апреля 2014

Существует простой способ удалить панель вкладок с панели действий.Просто введите:

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);

Это удалит любую вкладку-панель.

0 голосов
/ 08 сентября 2015

Это делается двумя простыми шагами (при условии, что вы настроили пользовательский вид на вкладки):

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

Я проверял это прямо сейчас, и он работает;)

0 голосов
/ 18 апреля 2014

Поздний ответ, но надеюсь, что этот обходной путь может помочь другим, кто интересуется этой проблемой.

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

    // ...
};

Если вы используете <a href="http://developer.android.com/reference/android/support/v4/view/ViewPager.html" rel="nofollow">ViewPager</a> с ним как обычно, вы можете просто использовать его позицию вместо mLastSelectedTabIndex вот так:

getActionBar().setSelectedNavigationItem(mViewPager.getCurrentItem());
0 голосов
/ 07 июня 2012

вы можете переопределить: public boolean onPrepareOptionsMenu(Menu menu), здесь установите / отключите вкладку, например:

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

и затем вы можете установить mMessageNeedtoSend true или false, вызвать invalidateOptionsMenu(), чтобы обновить ActionBar.

...