1

我已经在我的Android项目中使用了Sherlock库,并且希望将标签中的文本大小缩小一些。如何更改Android Sherlock FragmentTabsPager选项卡的文本大小和字体?

这是FragmentTabsPager.java

package com.actionbarsherlock.sample.fragments; 

import java.util.ArrayList; 
import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TabHost; 
import android.widget.TabWidget; 
import com.actionbarsherlock.app.SherlockFragmentActivity; 

/** 
* Demonstrates combining a TabHost with a ViewPager to implement a tab UI 
* that switches between tabs and also allows the user to perform horizontal 
* flicks to move between the tabs. 
*/ 
public class FragmentTabsPager extends SherlockFragmentActivity { 
    TabHost mTabHost; 
    ViewPager mViewPager; 
    TabsAdapter mTabsAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     setTheme(SampleList.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(); 

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

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

     mTabsAdapter.addTab(mTabHost.newTabSpec("simple").setIndicator("Messages"), 
       FragmentStackSupport.CountingFragment.class, null); 
     mTabsAdapter.addTab(mTabHost.newTabSpec("contacts").setIndicator("History"), 
       LoaderCursorSupport.CursorLoaderListFragment.class, null); 
     mTabsAdapter.addTab(mTabHost.newTabSpec("custom").setIndicator("Contacts"), 
       LoaderCustomSupport.AppListFragment.class, null); 
     mTabsAdapter.addTab(mTabHost.newTabSpec("throttle").setIndicator("Dialpad"), 
       LoaderThrottleSupport.ThrottledLoaderListFragment.class, null); 
     mTabsAdapter.addTab(mTabHost.newTabSpec("throttle").setIndicator("More"), 
       LoaderThrottleSupport.ThrottledLoaderListFragment.class, null); 

     if (savedInstanceState != null) { 
      mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
     } 
    } 

    @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>(); 

     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(); 
      int oldFocusability = widget.getDescendantFocusability(); 
      widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
      mTabHost.setCurrentTab(position); 
      widget.setDescendantFocusability(oldFocusability); 
     } 

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

,这里是相应的布局XML:这里https://github.com/JakeWharton/ActionBarSherlock/issues/401
然而

<LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TabWidget 
      android:id="@android:id/tabs" 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0"/> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="0dp" 
      android:layout_height="0dp" 
      android:layout_weight="0"/> 

     <android.support.v4.view.ViewPager 
      android:id="@+id/pager" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1"/> 

    </LinearLayout> 
</TabHost> 

而且我试过的解决方案,它不工作!

任何想法将深深感激!

回答

1

我有类似的问题定制我的标签。下面的代码改变标签的颜色,高度和文字colour.Hope它会有所帮助。

  View currentView; 

     final int height = 60; 
     for (int i = 0; i < tabChildrenCount; i++) { 
      currentView = mTabHost.getTabWidget().getChildAt(i); 
      LinearLayout.LayoutParams currentLayout = (LinearLayout.LayoutParams) currentView.getLayoutParams(); 
      currentLayout.setMargins(0, 2, 2, 0); 
      mTabHost.getTabWidget().setStripEnabled(true); 
      setTabColor(mTabHost); 
      mTabHost.getTabWidget().getChildAt(i).getLayoutParams().height = height; 

     final TextView tv = (TextView) mTabHost.getTabWidget().getChildAt(i).findViewById(android.R.id.title); 
     tv.setTextColor(Color.parseColor("#FFFFFF")); 
     if (tv instanceof TextView) { 
      // just in case check the type 

      // center text 
      ((TextView) tv).setGravity(Gravity.CENTER); 
      // wrap text 
      ((TextView) tv).setSingleLine(false); 
      // explicitly set layout parameters 
      tv.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT; 
      tv.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; 
     } 
     } 

    public static void setTabColor(TabHost tabhost) { 
for(int i=0;i<tabhost.getTabWidget().getChildCount();i++) 
{ 
    tabhost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#558FBB")); //unselected 
} 
tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseCol 

or("#236B8E")); // selected 
} 
相关问题