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

비슷한 문제가 내 탭을 사용자 정의했습니다. 아래의 코드는 탭 색상, 높이 및 텍스트 색상을 변경합니다. 도움이 될 것입니다.

  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 
}