启用/禁用Android ActionBar.Tab

时间:2012-03-06 14:25:24

标签: android android-fragments android-actionbar

我正在开发一个使用新Tabs系统(ActionBar.addTab())的应用程序,我将有3个选项卡。 在确定的过程中,我想锁定(禁用)其中两个(不删除,不接受点击而不更改'选择器'。

我无法更改内容(通过实现TabListener而不更改片段等),但选择器更改。

无论如何只能禁用/启用标签?无需删除并再次添加?

提前致谢! BR, 达尼洛

3 个答案:

答案 0 :(得分:2)

抱歉,操作栏中的标签没有“启用”或“禁用”。如您所知,您可以删除并重新添加它们 - 这是您可以获得最接近的AFAIK。

答案 1 :(得分:1)

我遇到了完全相同的问题。终于能够解决它了。如前所述,无法禁用/启用选项卡。只有一条出路 - 那就是使用

返回上一个标签
getActionBar().setSelectedNavigationItem(tab);

但是请注意,

中应该 NOT
onTabSelected(ActionBar.Tab tab,FragmentTransaction fragmentTransaction)

方法,因为它会在递归循环中陷入困境。因此在onTabSelected()中 - 向Activity Handler发送一个消息来执行setSelectedNavigation()。

这里有一个问题(您将在实施时知道):在setSelectedNavigation中传递什么“tab”值。为此,我们必须通过代码跟踪用户按下的标签切换或强制切换到最后一个标签。

为此:

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

答案 2 :(得分:0)

我也遇到了同样的问题。我的应用程序有三个选项卡,每个选项卡都有按钮移动到下一个和上一个选项卡。 我找不到任何启用或禁用选项卡的方法。

我使用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的oncreate方法中添加以下两行:

     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/

找到更多内容