2012-09-04 93 views
1

我已經嘗試了一切,我無法得到這個工作。我已閱讀關於此主題的所有相關帖子,但未找到工作解決方案!無法更改ActionBarSherlock標籤欄文本大小

我想使用ActionBarSherlock來改變標籤欄的文字大小。我設法改變了操作欄,但不是下面的標籤文本(或者標籤本身)。

在styles.xml我有(多次嘗試之一):

<style name="ANM_Theme" parent="Theme.Sherlock"> 
<item name="actionBarTabTextStyle">@style/Theme_ActionBarText</item> 
<item name="android:actionBarTabTextStyle">@style/Theme_ActionBarText</item> 

<style name="Theme_ActionBarText" parent="Widget.Sherlock.ActionBar.TabText"> 
<item name="android:textColor">#fff</item> 
<item name="android:textSize">6sp</item> 

而且在我的活動我設置

public static int THEME = R.style.ANM_Theme; 

然後

setTheme(THEME); 

之前

super.onCreate(savedInstanceState); 

編輯:

就意識到,當您使用標籤+傳呼機你沒有得到4.0外觀上的標籤!這說明了爲什麼我無法通過ActionBarSherlock主題自定義選項卡。我嘗試使用4.1設備。下載了ActionBarSherlock演示程序並得到了相同的結果。

任何人都知道如何解決它?

回答

0
public class MainActivity extends SherlockFragmentActivity { 
ViewPager mViewPager; 
TabsAdapter mTabsAdapter; 

Button testButton; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    mViewPager = (ViewPager)findViewById(R.id.pager); 

    // Add the tabs 
    mTabsAdapter = new TabsAdapter(this, bar, mViewPager); 
    mTabsAdapter.addTab(bar.newTab().setText("First"), 
      FragmentA.class, null); 
    mTabsAdapter.addTab(bar.newTab().setText("Second"), 
      FragmentB.class, null); 
    mTabsAdapter.addTab(bar.newTab().setText("Third"), 
      FragmentC.class, null); 

    setTitle(R.string.app_name); 

    if (savedInstanceState != null) { 
     bar.setSelectedNavigationItem(savedInstanceState.getInt("tab")); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); 
} 

@Override 
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) { 

    menu.add("Refresh") 
     .setIcon(R.drawable.ic_action_refresh) 
     .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 

    SubMenu subMenu1 = menu.addSubMenu("Menu"); 
    subMenu1.add("Sample"); 
    subMenu1.add("Items"); 
    subMenu1.add("In menu"); 

    MenuItem subMenu1Item = (MenuItem) subMenu1.getItem(); 
    subMenu1Item.setIcon(R.drawable.ic_action_overflow); 
    subMenu1Item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); 

    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) { 
    String itemTitle = (String) item.getTitle(); 

     if(!itemTitle.equals("Menu")){ 
      Toast toast = Toast.makeText(getApplicationContext(), itemTitle+" pressed", Toast.LENGTH_SHORT); 
      toast.show(); 
     } 


    if(item.getItemId() == android.R.id.home){ 
     getSupportFragmentManager().popBackStackImmediate(); 
    } 
    return super.onOptionsItemSelected(item); 

} 



public static class TabsAdapter extends FragmentPagerAdapter 
     implements ViewPager.OnPageChangeListener, ActionBar.TabListener { 
    private final Context mContext; 
    private final ActionBar mBar; 
    private final ViewPager mViewPager; 
    private FragmentActivity mActivity; 
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

    static final class TabInfo { 
     private final Class<?> clss; 
     private final Bundle args; 

     TabInfo(Class<?> _class, Bundle _args) { 
      clss = _class; 
      args = _args; 
     } 
    } 

    public TabsAdapter(FragmentActivity activity, ActionBar bar, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mActivity = activity; 
     mBar = bar; 
     mViewPager = pager; 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 

    } 

    public void addTab(ActionBar.Tab tab, Class<? extends Fragment> clss, Bundle args) { 
     TabInfo info = new TabInfo(clss, args); 
     tab.setTag(info); 
     tab.setTabListener(this); 
     mTabs.add(info); 
     mBar.addTab(tab); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return mTabs.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     TabInfo info = mTabs.get(position); 
     return Fragment.instantiate(mContext, info.clss.getName(), info.args); 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
    } 

    @Override 
    public void onPageSelected(int position) { 
     mBar.setSelectedNavigationItem(position); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     mActivity.getSupportFragmentManager().popBackStack(); 
     Object tag = tab.getTag(); 
     for (int i=0; i<mTabs.size(); i++) { 
      if (mTabs.get(i) == tag) { 
       mViewPager.setCurrentItem(i); 
      } 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 

    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 

    } 


} 

}

0

我終於用一種有點古怪的方式解決了我的問題。我添加了支持操作欄和常規tabhost,然後我隱藏了原始tabhost,並獲得了viewpager和支持操作欄以相互響應。

下面的代碼,如果有人有興趣:

public class MainActivity extends SherlockFragmentActivity { 
TabHost mTabHost; 
ViewPager mViewPager; 
TabsAdapter mTabsAdapter; 
static ActionBar bar; 
//public static int THEME = R.style.Theme_app; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //setTheme(THEME); //Used for theme switching in samples 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.fragment_tabs_pager); 


    mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
    mTabHost.setup(); 

    bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    ActionBar.Tab tab1 = bar.newTab(); 
    ActionBar.Tab tab2 = bar.newTab(); 
    ActionBar.Tab tab3 = bar.newTab(); 
    ActionBar.Tab tab4 = bar.newTab(); 
    ActionBar.Tab tab5 = bar.newTab(); 


    tab1.setText("Home"); 
    tab2.setText("Learn"); 
    tab3.setText("Media"); 
    tab4.setText("Connect"); 
    tab5.setText("The Book"); 

    tab1.setTabListener(new MyTabListener()); 
    tab2.setTabListener(new MyTabListener()); 
    tab3.setTabListener(new MyTabListener()); 
    tab4.setTabListener(new MyTabListener()); 
    tab5.setTabListener(new MyTabListener()); 

    bar.addTab(tab1); 
    bar.addTab(tab2); 
    bar.addTab(tab3); 
    bar.addTab(tab4); 
    bar.addTab(tab5); 

    mViewPager = (ViewPager)findViewById(R.id.pager); 

    mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager); 

    mTabsAdapter.addTab(mTabHost.newTabSpec("Home").setIndicator("Home"), 
      FragmentStackSupport.CountingFragment.class, null); 
    mTabsAdapter.addTab(mTabHost.newTabSpec("Learn").setIndicator("Learn"), 
      FragB.FragBList.class, null); 
    mTabsAdapter.addTab(mTabHost.newTabSpec("Media").setIndicator("Media"), 
      FragC.FragCList.class, null); 
    mTabsAdapter.addTab(mTabHost.newTabSpec("Connect").setIndicator("Connect"), 
      FragD.FragDList.class, null); 
    mTabsAdapter.addTab(mTabHost.newTabSpec("The Book").setIndicator("The Book"), 
      FragE.FragEList.class, null); 

    if (savedInstanceState != null) { 
     mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
    } 
    mTabHost.getTabWidget().getChildAt(0).setVisibility(View.GONE); 
    mTabHost.getTabWidget().getChildAt(1).setVisibility(View.GONE); 
    mTabHost.getTabWidget().getChildAt(2).setVisibility(View.GONE); 
    mTabHost.getTabWidget().getChildAt(3).setVisibility(View.GONE); 
    mTabHost.getTabWidget().getChildAt(4).setVisibility(View.GONE); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("tab", mTabHost.getCurrentTabTag()); 
} 

/** 
* This is a helper class that implements the management of tabs and all 
* details of connecting a ViewPager with associated TabHost. It relies on a 
* trick. Normally a tab host has a simple API for supplying a View or 
* Intent that each tab will show. This is not sufficient for switching 
* between pages. So instead we make the content part of the tab host 
* 0dp high (it is not shown) and the TabsAdapter supplies its own dummy 
* view to show as the tab content. It listens to changes in tabs, and takes 
* care of switch to the correct paged in the ViewPager whenever the selected 
* tab changes. 
*/ 
public static class TabsAdapter extends FragmentPagerAdapter 
     implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener { 
    private final Context mContext; 
    private final TabHost mTabHost; 
    private final ViewPager mViewPager; 
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 
    public static int tabPosition; 

    static final class TabInfo { 
     private final String tag; 
     private final Class<?> clss; 
     private final Bundle args; 

     TabInfo(String _tag, Class<?> _class, Bundle _args) { 
      tag = _tag; 
      clss = _class; 
      args = _args; 
     } 
    } 

    static class DummyTabFactory implements TabHost.TabContentFactory { 
     private final Context mContext; 

     public DummyTabFactory(Context context) { 
      mContext = context; 
     } 

     @Override 
     public View createTabContent(String tag) { 
      View v = new View(mContext); 
      v.setMinimumWidth(0); 
      v.setMinimumHeight(0); 
      return v; 
     } 
    } 

    public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mTabHost = tabHost; 
     mViewPager = pager; 
     mTabHost.setOnTabChangedListener(this); 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) { 
     tabSpec.setContent(new DummyTabFactory(mContext)); 
     String tag = tabSpec.getTag(); 

     TabInfo info = new TabInfo(tag, clss, args); 
     mTabs.add(info); 
     mTabHost.addTab(tabSpec); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return mTabs.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     TabInfo info = mTabs.get(position); 
     return Fragment.instantiate(mContext, info.clss.getName(), info.args); 
    } 

    @Override 
    public void onTabChanged(String tabId) { 
     int position = mTabHost.getCurrentTab(); 
     mViewPager.setCurrentItem(position); 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
    } 

    @Override 
    public void onPageSelected(int position) { 
     // Unfortunately when TabHost changes the current tab, it kindly 
     // also takes care of putting focus on it when not in touch mode. 
     // The jerk. 
     // This hack tries to prevent this from pulling focus out of our 
     // ViewPager. 
     TabWidget widget = mTabHost.getTabWidget(); 

     widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
     mTabHost.setCurrentTab(position); 
     bar.setSelectedNavigationItem(position); 
     //widget.setDescendantFocusability(oldFocusability); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
    } 
} 

private class MyTabListener implements ActionBar.TabListener 
{ 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     try { 
      mViewPager.setCurrentItem(tab.getPosition()); 
     } catch (Exception e) { 
      // TODO: handle exception 
     } 
     // 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 

} 

}

+0

這是有點hackish的,還有沒有其他的方法? – lemon

+0

是的,有=)我最終對這個解決方案並不滿意,請參閱下面的答案。 – Thoast83