2012-03-06 3 views
8

Я разрабатываю приложение, которое использует новую систему вкладок (ActionBar.addTab()), у меня будет 3 вкладки. В течение определенного процесса я хотел бы заблокировать (отключить) два из них (не удалять, только не принимать клики и не изменять «селектор».Включить/отключить Android ActionBar.Tab

Я был в состоянии не изменять содержимое (путем реализации TabListener и не изменяя фрагмент, и т.д.), но изменения селекторов.

есть в любом случае только отключить/включить вкладки? не нужно удалять и добавлять снова?

заранее спасибо! BR, Данило

ответ

2

Извините, нет разрешения "или" отключить "с вкладками в панели действий. Как вы заметили, вы можете удалить и повторно добавить их - это самый близкий вам AFAIK.

+3

Да, я вижу! Благодарю. У меня есть менеджер, чтобы добавить странное поведение, добавив проверку TabListener, если я «могу» изменить вкладки, которые я меняю, если не переустановить последнюю вкладку = P – DaniloBertelli

+2

@DaniloBertelli. Ваше обходное решение не так просто. Чтобы он обновил выбранную вкладку «Просмотр», ваша «повторная выбор последней вкладки» должна быть в Runnable в очереди через сообщение в одном из представлений. Если вы действительно хотите знать, зачем тогда искать в ScrollingTabContainerView # TabClickListener.onClick - поскольку ваш вызов tab.select должен быть после вызова [child.setSelected] (http://is.gd/OCa2tF) в этом методе. – Daniel

+0

@ Даниэль не хватает символов в этом поле ввода, чтобы выразить свою благодарность. В основном я уже использую 'Handler' для различных задач async в моей' Activity', я просто ставил 'setSelectedNavigationItem()' как новый '' Runnable'' с '' postAtFrontOfQueue() '' там. Brilliant! – foxx1337

1

Я попал в ту же самую проблему. Наконец удалось решить проблему. Как уже говорилось, нет возможности отключить/включить вкладку. Существует только один выход - и это, чтобы вернуться на предыдущую вкладку с помощью

getActionBar().setSelectedNavigationItem(tab); 

Заметим, однако, что это должно НЕ быть сделано в рамках метода

onTabSelected(ActionBar.Tab tab,FragmentTransaction fragmentTransaction) 

, потому что тогда он застревает в рекурсивном цикле. Таким образом, внутри onTabSelected() - отправить messsage обработчику активности для выполнения setSelectedNavigation().

Один улов здесь (вы узнаете, когда вы его реализуете): какое значение «табуляции» нужно передать в setSelectedNavigation. Для этого мы должны отслеживать, является ли это нажатием кнопки вкладок пользователя или принудительным переключением на последнюю вкладку с помощью кода.

Для этого:

public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 

    if (forcedTabSwitch) 
     forcedTabSwitch = false; 
    else 
     mTabToBeSwitchedTo = tab.getPosition(); 
} 

и в обработчике,

switch (msg.what) { 
      case SWITCH_TO_TAB : 
       forcedTabSwitch = true; 
          break; 
} 
+0

Привет, для меня getActionBar(). SetSelectedNavigationItem (позиция) не работает. Что может быть проблемой, я пытаюсь установить положение вкладки на некоторых условиях. Кто-нибудь может мне помочь.. – user448250

0

Я также столкнулся с такой же приложение problem.My имеет три вкладки и каждая вкладка имеет кнопки для перемещения на следующую и предыдущую вкладку. Я не могу найти способ включения или отключения вкладок.

Я использовал класс DataSetter для хранения ранее выбранной позиции табуляции и логического значения для определения выбора вкладки. Если флаг boolean имеет значение true, тогда пользователь нажал следующую/предыдущую кнопку. В противном случае пользователь пытается выбрать вкладку, нажав , которую мы не разрешаем.
Я использовал обработчик для выбора вкладки. Внутри фрагмента, когда пользователь нажимает следующую кнопку, я транслирую этот запрос. Запрос широковещательной передачи имеет целочисленный параметр, который является позицией следующей или предыдущей вкладки, которую мы хотим установить. Код внутри фрагмента:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
    { 
     View rootView = inflater.inflate(R.layout.first_tab_fragment, container, false); 
     next = (Button)rootView.findViewById(R.id.nextbutton); 
     next.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Intent intent = new Intent("TAB_CLICKED"); 
      Bundle bundle = new Bundle(); 
      bundle.putInt(MainActivity.POSITION,1); 
      intent.putExtras(bundle); 
      getActivity().sendBroadcast(intent); 
     } 
    }); 
    return rootView; 
    } 

Я использовал CustomViewPager вместо ViewPager, чтобы предотвратить вкладку Swiping. CustomViewPager класс:

  public class CustomViewPager extends ViewPager {    

      private boolean enabled;    
      public CustomViewPager(Context context) { 
       super(context); 
      } 

      public CustomViewPager(Context context, AttributeSet attrs) { 
       super(context, attrs); 
      } 

      @Override 
      public boolean onTouchEvent(MotionEvent event) { 
       // TODO Auto-generated method stub 
       if (this.enabled) { 
        return super.onTouchEvent(event); 
       } 

       return false; 
      } 

      @Override 
      public boolean onInterceptTouchEvent(MotionEvent event) { 
       // TODO Auto-generated method stub 
       if (this.enabled) { 
         return super.onInterceptTouchEvent(event); 
        } 

        return false; 
      } 

      public void setPagingEnabled(boolean enabled) { 
       this.enabled = enabled; 
      }    
     } 

Внутри OnCreate метод MainActivity.Java добавить эти две строки:

 viewPager = (CustomViewPager) findViewById(R.id.pager); 
    viewPager.setPagingEnabled(false); 

Ниже оставшийся код из MainActivity.java:

@Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 

    Log.d("MainActivity","onTabSelected"); 
    if(setter.getFlag() == true) 
    { 
     viewPager.setCurrentItem(setter.getposition()); 
    }   
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
    Log.d("MainActivity","onTabUnselected");  
    //handler.sendEmptyMessage(0); 
    Message message = new Message(); 
    message.arg1 = setter.getposition(); 
    handler.sendMessage(message);  
} 

Handler handler = new Handler() 
{ 
    public void handleMessage(android.os.Message msg) 
    { 
     int arg1 = msg.arg1;    
     Log.d("arg1",arg1+""); 
     //viewPager.setCurrentItem(arg1); 
     mActionBar.setSelectedNavigationItem(arg1); 
     Log.d("handler","Inside handler"); 
    } 
}; 

BroadcastReceiver receiver = new BroadcastReceiver(){ 

    public void onReceive(Context context, android.content.Intent intent) { 

     String action = intent.getAction(); 
     Bundle bundle = intent.getExtras(); 
     int position = bundle.getInt(MainActivity.POSITION); 
     Log.d("Action",action); 
     Log.d("position",position+""); 
     setter.setposition(position); 
     setter.setflag(true); 
     Message message = new Message(); 
     message.arg1 = position; 
     handler.sendMessage(message); 
    }; 
    }; 
} 

Наконец DataSetter.java:

public class DataSetter 
    { 
     int position; 
     boolean flag; 
     void setposition(int value) 
     { 
      position = value; 
     } 
     void setflag(boolean value) 
     { 
      flag = value; 
     } 
     int getposition() 
     { 
      return position; 
     } 
     boolean getFlag() 
     { 
      return flag; 
     } 
    } 

Далее вы можете найти на: http://suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/

Смежные вопросы