2012-03-06 26 views
8

Tôi đang phát triển một ứng dụng sử dụng hệ thống Tab mới (ActionBar.addTab()), tôi sẽ có 3 tab. Trong quá trình xác định, tôi muốn khóa (vô hiệu hóa) hai trong số chúng (không xóa, chỉ không chấp nhận các nhấp chuột và không thay đổi 'bộ chọn'.Bật/Tắt Android ActionBar.Tab

Tôi không thể thay đổi nội dung (bằng cách thực hiện TabListener và không thay đổi đoạn, vv), nhưng những thay đổi selector.

Liệu có cách nào để chỉ tắt/bật tab? mà không cần phải gỡ bỏ và thêm một lần nữa?

Cảm ơn trước! BR, Danilo

Trả lời

2

Rất tiếc, không có "bật "hoặc" vô hiệu hóa "với các tab trong thanh tác vụ. Như bạn lưu ý, bạn có thể xóa và thêm lại chúng - đó là gần nhất bạn có thể lấy AFAIK.

+3

Vâng, tôi hiểu rồi! Cảm ơn. Tôi đã quản lý để thêm một hành vi kỳ lạ bằng cách thêm một kiểm tra trên TabListener, nếu tôi "có thể" thay đổi các tab tôi thay đổi, nếu không tôi chọn lại tab mới nhất = P – DaniloBertelli

+2

@DaniloBertelli Cách giải quyết của bạn không đơn giản. Để cập nhật tab đã chọn Xem đúng cách "chọn lại tab mới nhất" sẽ cần phải có trong hàng Runnable được xếp hàng đợi qua một bài đăng trên một trong các chế độ xem. Nếu bạn thực sự muốn biết lý do tại sao hãy tìm trong ScrollingTabContainerView # TabClickListener.onClick - như cuộc gọi tab.select của bạn sẽ cần phải sau cuộc gọi đến [child.setSelected] (http://is.gd/OCa2tF) trong phương thức đó. – Daniel

+0

@Daniel không có đủ ký tự trong hộp nhập này để thể hiện lời cảm ơn của tôi. Về cơ bản tôi đã sử dụng một 'Handler' cho các nhiệm vụ async khác nhau trong' Activity' của tôi, tôi chỉ cần đặt 'setSelectedNavigationItem()' là một '' Runnable'' mới với '' postAtFrontOfQueue() '' ở đó. Rực rỡ! – foxx1337

1

Tôi gặp vấn đề tương tự. Cuối cùng đã có thể giải quyết nó. Như đã nói, không có cách nào để vô hiệu/kích hoạt một tab. Chỉ có một lối thoát - và đó là quay trở lại tab trước đó sử dụng

getActionBar().setSelectedNavigationItem(tab); 

Lưu ý tuy nhiên, điều này nên KHÔNG được thực hiện từ bên trong phương thức

onTabSelected(ActionBar.Tab tab,FragmentTransaction fragmentTransaction) 

, bởi vì sau đó nó bị mắc kẹt trong vòng lặp đệ quy. Vì vậy, trong onTabSelected() - gửi một messsage đến trình xử lý hoạt động để làm setSelectedNavigation().

Một điểm bắt ở đây là (bạn sẽ biết khi nào bạn triển khai): giá trị "tab" nào sẽ vượt qua trong setSelectedNavigation. Đối với điều này, chúng ta phải theo dõi xem nó là một người sử dụng nhấn tab chuyển đổi hoặc buộc phải chuyển sang tab cuối cùng thông qua mã.

Đối với điều này:

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

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

và trong Handler,

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

Xin chào, đối với tôi getActionBar(). SetSelectedNavigationItem (vị trí) không hoạt động. Vấn đề có thể là gì, tôi đang cố gắng đặt vị trí của tab trên một số điều kiện. Ai đó có thể giúp tôi.. – user448250

0

Tôi cũng phải đối mặt với cùng một ứng dụng problem.My có ba tab và mỗi tab có nút để chuyển sang tab tiếp theo và trước đó. Tôi không tìm thấy bất kỳ phương pháp nào để bật hoặc tắt tab.

Tôi đã sử dụng lớp DataSetter để giữ vị trí tab đã chọn trước đó và giá trị boolean để xác định lựa chọn tab. Nếu cờ boolean là đúng thì người dùng đã nhấn nút tiếp theo/trước đó. Nếu không, người dùng đang cố gắng chọn tab bằng cách nhấn chúng mà chúng tôi không cho phép.
Tôi đã sử dụng trình xử lý để chọn tab.Phần bên trong khi người dùng nhấp vào nút tiếp theo Tôi phát sóng yêu cầu đó. Yêu cầu phát sóng có tham số nguyên là vị trí của tab tiếp theo hoặc trước đó mà chúng tôi muốn đặt. Mã bên trong phân đoạn là:

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

Tôi đã sử dụng CustomViewPager thay vì ViewPager để ngăn chặn việc vuốt tab. Lớp CustomViewPager là:

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

Phương pháp onCreate bên trong của MainActivity.java thêm này hai dòng: Mã

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

Dưới đây còn lại từ 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); 
    }; 
    }; 
} 

Cuối cùng 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; 
     } 
    } 

hơn bạn có thể tìm thấy trên: http://suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/