2012-03-06 77 views
8

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

我能够不改变内容(通过实施TabListener并没有改变片段等),但选择的变化。

反正是有只禁用/启用选项卡?没有必须删除并重新添加?提前

谢谢! BR, 达尼洛

回答

2

对不起,没有“启用“或”禁用“标签在操作栏中。正如你注意到的,你可以删除并重新添加它们 - 这是最接近你可以得到AFAIK。

+3

是的,我明白了!谢谢。我有经理通过在TabListener上添加一个检查来添加一个奇怪的行为,如果我“可以”更改我更改的选项卡,如果不是,我重新选择最新的选项卡= P – DaniloBertelli 2012-03-12 13:14:56

+2

@DaniloBertelli您的解决方法并不那么简单。为了更新选定的选项卡,正确地查看您的“重新选择最新的选项卡”需要位于通过其中一个视图的帖子排队的Runnable中。如果你真的想知道为什么然后看看ScrollingTabContainerView#TabClickListener.onClick - 因为你的tab.select调用需要在该方法调用[child.setSelected](http://is.gd/OCa2tF)之后。 – Daniel 2013-10-03 22:42:20

+0

@Daniel这个输入框中没有足够的字符来表达我的感谢。基本上我已经在我的Activity中为各种异步任务使用了一个'Handler',我简单地把'setSelectedNavigationItem()'作为一个新的''Runnable''用''postAtFrontOfQueue()''在那里。辉煌! – foxx1337 2014-01-15 14:53:42

1

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

getActionBar().setSelectedNavigationItem(tab); 

不过请注意,以返回到前一个标签,这应该

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

嗨,对我来说,getActionBar()。setSelectedNavigationItem(position)不起作用。什么可能是问题,我试图在一些条件下设置标签的位置。有人能帮我吗.. – user448250 2015-06-04 04:57:13

0

我也面临同样的problem.My应用程序有三个选项卡和每个标签都有按钮移动到下一个和前一个标签。 我没有找到任何启​​用或禁用选项卡的方法。

我使用DataSetter类来保存先前选择的标签位置和布尔值来确定选项卡选择。 如果布尔标志为真,则用户按下一个/上一个按钮。否则,用户正尝试通过按 选择标签,这是我们不允许的。
我使用处理程序选项卡selection.Inside片段,当用户点击下一个按钮我广播该请求。 广播请求有整数参数,它是我们要设置的下一个或上一个选项卡的位置。内部片段 代码是:

@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的onCreate方法。java的添加此两行:从MainActivity.java

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

下面是剩余代码:

@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/