Включить / отключить Android ActionBar.Tab - PullRequest
8 голосов
/ 06 марта 2012

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

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

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

Заранее спасибо!BR, Danilo

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

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

1 голос
/ 13 июня 2014

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

getActionBar().setSelectedNavigationItem(tab);

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

onTabSelected(ActionBar.Tab tab,FragmentTransaction fragmentTransaction)

метод, потому что тогда он застревает в рекурсивном цикле.Таким образом, в onTabSelected () - отправьте сообщение в обработчик действий, чтобы выполнить 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 голосов
/ 09 октября 2014

Я также столкнулся с той же проблемой. В моем приложении есть три вкладки, и на каждой вкладке есть кнопки для перехода на следующую и предыдущую вкладки.Я не нахожу способ включить или отключить вкладку.

Я использовал класс DataSetter для хранения ранее выбранной позиции вкладки и логического значения для определения выбора вкладки.Если логический флаг равен 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, чтобы предотвратить считывание вкладок.Класс 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;
            }             
        }

Внутри встроенного метода 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/

...