Intereting Posts
Просмотр владельца и пользовательский список элементов просмотра, перетасованных при прокрутке Объединение из ветви вверх по ветвям в ветку поставщика, где ветвь поставщика содержит подмножество восходящих коммитов Java / Android: чтение / запись массива байтов через сокет Как удалить опубликованное приложение с моего аккаунта Android? RecyclerView LayoutManager findViewByPosition возвращает null Android – Как эффективно загружать большое количество текста в TextView? Получить JSONObject по ID из другого JSONObject – Android Android MVP open Activity from Presenter, анти-шаблон? Возможно ли передать onTouchEvent несколько просмотров в Android? Публикация необработанных данных изображения вместо URL-адреса с помощью Android Facebook SDK Продолжить воспроизведение проигрывателя YouTube во время вращения устройства с раздельными макетами ориентации Получить жанр песни Force EditText потеряет фокус при нажатии Android-запись с квадратным видео и concat Правильный способ реализации onMeasure () и onLayout () в пользовательском AdapterView

Включить / отключить вкладку в ActionBar

Можно включить / отключить вкладки в 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!!*/ 

Как я могу сделать??

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

 bar.removeTab( tab ); 

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

 bar.addTab( tab, savedTabPosition ); 

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

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

Первый шаг

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

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

Дайте мне знать, как это происходит 🙂

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

 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 

Это приведет к удалению всех вкладок.

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

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

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

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

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

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

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

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