2011-11-17 34 views
6

Có thể bật/tắt Tab trong ActionBar? Với TabHost đây không phải là một vấn đề .. Tôi làm:Bật/Tắt Tab trong ActionBar

tabHost.getTabWidget().getChildAt(3).setVisibility(true); 

và tất cả các công trình .. nhưng nếu tôi muốn làm điều tương tự với Tabs trong ActionBar ?? Trong lớp Tab không tồn tại setEnable();

ActionBar bar = getActionBar(); 
Tab tab = bar.newTab(); 
tab.setText("Test"); 
tab.setEnable(false); /*DON'T EXIST!!*/ 

Làm cách nào tôi có thể làm ??

Trả lời

7

Bạn có thể sử dụng removeTab(ActionBar.Tab tab) -method của ActionBar:

bar.removeTab(tab); 

Và sau đó sử dụng addTab(ActionBar.Tab tab, int position) để đưa nó trở lại, với điều kiện là bạn lưu vị trí của Tab bạn đã xóa:

bar.addTab(tab, savedTabPosition); 
+1

Đây không phải là điều tương tự .. tôi không muốn quay lại di chuyển sau đó thêm lại ... tôi sẽ chỉ làm cho nó bật/tắt ... tôi muốn rằng tab vẫn xuất hiện trong bố cục! Cảm ơn bạn đã asnwer của bạn – Babez21584

+0

Tôi đã đăng một gợi ý trong một câu trả lời mới. Kiểm tra nó ra. – kaspermoerch

4

Tôi chưa thử nghiệm điều này - điều đó sẽ tùy thuộc vào bạn, nhưng nó sẽ cung cấp cho bạn một ý tưởng chung về cách bạn có thể xử lý vấn đề của mình.

Có ba bước sau:

Bước đầu tiên

Chúng ta cần cái gì đó có thể xử lý cho phép/vô hiệu hóa hành động cho chúng ta. Với mục đích này, chúng tôi tạo ra các lớp sau đây:

public class TabItem { 
    private Tab tab; 
    private Fragment fragment; 
    private boolean enabled; 

    public TabItem(Tab tab, Fragment fragment) { 
    this.tab = tab; 
    this.fragment = fragment; 
    enabled = true; 
    } 

    public Tab getTab() { 
    return tab; 
    } 

    public Fragment getFragment() { 
    return fragment; 
    } 

    public void toggleEnabled() { 
    enabled = enabled ? false : true; 
    } 

    public boolean isEnabled() { 
    return enabled; 
    } 
} 

Thứ hai bước

Chúng ta cần một cái gì đó có thể chứa những TabItems và một cách dễ dàng để truy cập chúng. Với mục đích này chúng ta thêm lớp sau đây:

public class TabHolder { 
    private HashMap<Integer, TabItem> tabs; 

    public TabHolder() { 
    tabs = new HashMap<Integer, TabItem>(); 
    } 

    public void addTab(TabItem tab) { 
    tabs.put(tab.getTab().getPosition(), tab); 
    } 

    public TabItem getTab(int position) { 
    return tabs.get(position); 
    } 
} 

Thứ ba bước

Chúng ta cần phải xử lý việc lựa chọn Tabs mình, vì vậy chúng ta cần phải tạo ra một tùy chỉnh TabListener:

private class MyTabListener implements TabListener { 
    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    //Do nothing - unless you want to do something. 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    TabItem item = tabHolder.getTab(tab.getPosition()); 
    if(item.isEnabled()) { 
     ft.remove(item.getFragment()); 
     ft.commit(); 
    }   
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    //Do nothing - unless you want to do something.   
    } 
} 

Cuối cùng

Hiện tại, chúng tôi có thể sử dụng khung được tạo của chúng tôi.Để làm như vậy, chúng ta cần một TabHolder:

tabHolder = new TabHolder(); //Needs to be declared in the same class as our TabListener 

Chúng ta cần phải thêm chúng tôi Tabs này:

tabHolder.addTab(new TabItem(tab, fragmentForThisTab)); 

Và chúng ta cần phải thiết lập tùy chỉnh của chúng tôi TabListener trên mỗi Tab:

tab.setTabListener(new MyTabListener()); 

Bật/Tắt

Để bật hoặc tắt một Tab chúng ta chỉ cần gọi:

tabHolder.getTab(position).toggleEnabled(); 

Hãy cho tôi biết làm thế nào nó đi :)

+0

Làm cách nào để kết hợp với ActionBar? – Daniel

+0

Bạn gọi tabHolder.getTab (vị trí) .getTab() để nhận tab và sau đó thêm tab đó vào ActionBar. – kaspermoerch

+0

Nhưng ActionBar.addTab nhận một ActionBar.Tab, mà TabItem không tương thích với. – Daniel

0

bạn có thể ghi đè lên: public boolean onPrepareOptionsMenu(Menu menu), ở đây đặt tab bật/tắt cho ví dụ:

menu.findItem(R.id.send).setEnabled(mMessageNeedtoSend); 

và sau đó bạn có thể đặt mMessageNeedtoSend đúng hoặc sai, gọi invalidateOptionsMenu() để làm mới ActionBar.

0

Trả lời muộn nhưng hy vọng cách giải quyết này có thể giúp những người khác quan tâm đến vấn đề này.

private Handler mHandler; 
private int mLastSelectedTabIndex = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // ... 

    mHandler = new Handler(); 

    // ... 

    ActionBar bar = getActionBar(); 

    Tab tab = bar.newTab().setText("Enabled Tab") 
      .setTabListener(mTabListener); 
    bar.addTab(tab); 

    tab = bar.newTab().setText("Disabled Tab") 
      .setTabListener(mTabListener); 
    bar.addTab(tab); 
} 

private TabListener mTabListener = new TabListener() { 
    // ... 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     int position = tab.getPosition(); 
     if (position == 1) { 
      // Disabled tabs are selected. 

      mHandler.postAtFrontOfQueue(new Runnable() { 
       @Override 
       public void run() { 
        getActionBar().setSelectedNavigationItem(
          mLastSelectedTabIndex); 
       } 
      }); 
     } else { 
      // Enabled tabs are selected. Do something on your own. 

      mLastSelectedTabIndex = position; 
     } 
    } 

    // ... 
}; 

Nếu bạn đang sử dụng ViewPager với nó như bình thường, bạn chỉ có thể sử dụng vị thế của mình thay vì mLastSelectedTabIndex như thế này:

getActionBar().setSelectedNavigationItem(mViewPager.getCurrentItem()); 
+0

http: //suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/Ví dụ làm việc. –

3

Có một cách đơn giản để loại bỏ các Tabs-bar từ Actionbar . Chỉ cần nhập:

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 

Thao tác này sẽ xóa mọi tab-tab.

+0

actionbar.removeAllTabs() –

0

này được thực hiện bởi hai bước đơn giản (Giả sử bạn thiết lập giao diện tùy chỉnh để các tab):

1- Vô hiệu hoá chức năng: Tránh thay đổi các tab

@Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
     int position = tab.getPosition(); 
     if (mModifyMode) { 
      mPagerAdapter.changeFragment(position); 
     } 
    } 

2- Disable nhấp chuột sự kiện:

public void setModifyMode(boolean modifyMode) { 
     mModifyMode = modifyMode; 
     for (int i = 0; i < mActionBar.getTabCount(); i++) { 
      View parent = (View) mActionBar.getTabAt(i).getCustomView().getParent(); 
      parent.setEnabled(mModifyMode); 
     } 
    } 

Tôi đã thử nghiệm nó ngay bây giờ và nó đang hoạt động;)

Các vấn đề liên quan