问题
It's possible to enable/disable Tabs in ActionBar? With TabHost this is not a problem.. I do:
tabHost.getTabWidget().getChildAt(3).setVisibility(true);
and all works.. but if i want to do the same thing with Tabs in ActionBar??
In Tab class don't exist setEnable();
ActionBar bar = getActionBar();
Tab tab = bar.newTab();
tab.setText("Test");
tab.setEnable(false); /*DON'T EXIST!!*/
How can I do??
回答1:
You could use the removeTab( ActionBar.Tab tab )-method of ActionBar:
bar.removeTab( tab );
And then use the addTab( ActionBar.Tab tab, int position ) to put it back in, provided that you save the position of the Tab you removed:
bar.addTab( tab, savedTabPosition );
回答2:
I haven't tested this - that will be up to you, but it should give you an general idea on how you could handle your problem.
There are three steps:
First step
We need something that can handle the enable/disable action for us. For this purpose we create the following class:
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;
}
}
Second step
We need something that can hold these TabItems and an easy way to access them. For this purpose we add the following class:
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 );
}
}
Third step
We need to handle the selection of Tabs ourselves, so we need to create a custom 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.
}
}
Finally
We can now utilize our created framework. To do so, we need a TabHolder:
tabHolder = new TabHolder(); //Needs to be declared in the same class as our TabListener
We need to add our Tabs to this:
tabHolder.addTab( new TabItem( tab, fragmentForThisTab ) );
And we need to set our custom TabListener on each Tab:
tab.setTabListener( new MyTabListener() );
Enable/Disable
To enable or disable a Tab we simply call:
tabHolder.getTab( position ).toggleEnabled();
Let me know how it goes :)
回答3:
There is a simple way to remove the Tabs-bar from the Actionbar. Just type:
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
This will remove any tabs-bar.
回答4:
you can override:
public boolean onPrepareOptionsMenu(Menu menu), in here set the tab enable/disable for example:
menu.findItem(R.id.send).setEnabled(mMessageNeedtoSend);
and then you can set the mMessageNeedtoSend true or false,call invalidateOptionsMenu() to refresh ActionBar.
回答5:
Late answer but hope this workaround might help others who are interested in this issue.
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;
}
}
// ...
};
If you are using ViewPager with it as usual, you can simply utilize its position instead of mLastSelectedTabIndex like this:
getActionBar().setSelectedNavigationItem(mViewPager.getCurrentItem());
回答6:
This is done by two simple steps(Assuming you set custom view to the tabs):
1- Disable function: Avoid changing tabs
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
int position = tab.getPosition();
if (mModifyMode) {
mPagerAdapter.changeFragment(position);
}
}
2- Disable click events:
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);
}
}
I tested it right now and it is working ;)
来源:https://stackoverflow.com/questions/8165008/enable-disable-tab-in-actionbar