可以在ActionBar中启用/禁用Tabs吗? 使用TabHost这不是问题..我这样做:
tabHost.getTabWidget().getChildAt(3).setVisibility(true);
并且所有工作..但是如果我想在ActionBar中用Tabs做同样的事情?
在Tab类中不存在setEnable();
ActionBar bar = getActionBar();
Tab tab = bar.newTab();
tab.setText("Test");
tab.setEnable(false); /*DON'T EXIST!!*/
我该怎么办?
答案 0 :(得分:7)
您可以使用ActionBar
的{{1}}方法:
bar.removeTab( tab );
然后使用removeTab( ActionBar.Tab tab )
将其重新插入,只要您保存已移除的Tab
的位置:
bar.addTab( tab, savedTabPosition );
答案 1 :(得分:4)
我没有对此进行测试 - 这取决于您,但它应该让您对如何处理问题有一个大概的了解。
有三个步骤:
第一步
我们需要能够为我们处理启用/禁用操作的内容。为此,我们创建了以下类:
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;
}
}
第二步
我们需要一些可以容纳这些TabItems
的东西,并且可以轻松访问它们。为此,我们添加以下类:
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 );
}
}
第三步
我们需要自己处理Tabs
的选择,因此我们需要创建自定义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.
}
}
<强>最后强>
我们现在可以利用我们创建的框架。为此,我们需要TabHolder
:
tabHolder = new TabHolder(); //Needs to be declared in the same class as our TabListener
我们需要将Tabs
添加到此处:
tabHolder.addTab( new TabItem( tab, fragmentForThisTab ) );
我们需要在每个TabListener
上设置自定义Tab
:
tab.setTabListener( new MyTabListener() );
启用/禁用强>
要启用或停用Tab
,我们只需致电:
tabHolder.getTab( position ).toggleEnabled();
让我知道它是怎么回事:))
答案 2 :(得分:3)
有一种简单的方法可以从操作栏中删除选项卡栏。只需输入:
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
这将删除所有标签栏。
答案 3 :(得分:0)
你可以覆盖:
public boolean onPrepareOptionsMenu(Menu menu)
,在此处设置选项卡启用/禁用,例如:
menu.findItem(R.id.send).setEnabled(mMessageNeedtoSend);
然后您可以设置mMessageNeedtoSend
true或false,调用invalidateOptionsMenu()
来刷新ActionBar。
答案 4 :(得分:0)
迟到的答案,但希望这种解决方法可以帮助其他对此问题感兴趣的人。
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;
}
}
// ...
};
如果您像往常一样使用ViewPager
,则只需使用其位置而不是mLastSelectedTabIndex
,如下所示:
getActionBar().setSelectedNavigationItem(mViewPager.getCurrentItem());
答案 5 :(得分:0)
这是通过两个简单步骤完成的(假设您为选项卡设置了自定义视图):
1-禁用功能:避免更改标签
.kcm
2-禁用点击事件:
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
int position = tab.getPosition();
if (mModifyMode) {
mPagerAdapter.changeFragment(position);
}
}
我现在测试它并且它正在工作;)