2016-12-10 74 views
0

我想从下面的代码中为标题(“标签项目1”,“标签项目2”,“标签项目3”)设置自定义字体。我对Android Studio和Java非常陌生,并且只是通过在互联网上进行的练习和善意材料进行学习。在标签上设置Android自定义字体标题

假设我的资产文件夹中已经有一个名为“abc.ttf”的字体,我该如何更改标签标题的字体?下面是我TabFragment.java

import android.graphics.Typeface; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.design.widget.TabLayout; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.widget.AppCompatTextView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 


public class TabFragment extends Fragment { 

    TabLayout mTabLayout; 
    ViewPager mViewPager; 
    private static final int int_items = 3; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     /** 
     *Inflate tab_layout and setup Views. 
     */ 
     View x = inflater.inflate(R.layout.tabbed_layout, null); 
     mTabLayout = (TabLayout) x.findViewById(R.id.tabs); 
     mViewPager = (ViewPager) x.findViewById(R.id.viewpager); 

     /** 
     *Set an Apater for the View Pager 
     */ 
     mViewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 

     /** 
     * Now , this is a workaround , 
     * The setupWithViewPager dose't works without the runnable . 
     * Maybe a Support Library Bug . 
     */ 

     mTabLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       mTabLayout.setupWithViewPager(mViewPager); 
      } 
     }); 

     return x; 

    } 

    class MyAdapter extends FragmentPagerAdapter { 

     public MyAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     /** 
     * Return fragment with respect to Position . 
     */ 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return new TabOneFragment(); 
       case 1: 
        return new TabTwoFragment(); 
       case 2: 
        return new TabThreeFragment(); 
      } 
      return null; 
     } 

     @Override 
     public int getCount() { 

      return int_items; 

     } 

     /** 
     * This method returns the title of the tab according to the position. 
     */ 



     @Override 
     public CharSequence getPageTitle(int position) { 

      switch (position) { 
       case 0: 

        return "Tab Item 1"; 
       case 1: 
        return "Tab Item 2"; 
       case 2: 
        return "Tab Item 3"; 
      } 
      return null; 
     } 
    } 

} 

,这里是我的tabbed_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:orientation="vertical" 
android:layout_height="wrap_content"> 


<android.support.design.widget.TabLayout 
    android:id="@+id/tabs" 
    app:tabGravity="fill" 
    app:tabMode="fixed" 
    android:background="@color/white" 
    app:tabIndicatorColor="@color/colorPrimary" 
    app:tabSelectedTextColor="@color/colorPrimary" 
    app:tabTextColor="@color/black" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

<android.support.v4.view.ViewPager 
    android:id="@+id/viewpager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

</android.support.v4.view.ViewPager> 


</LinearLayout> 

回答

1

创建CustomTabLayout类将从Tablayout驱动器,然后在xml使用CustomTablayout而不是Tablayout

import android.content.Context; 
import android.graphics.Typeface; 
import android.support.design.widget.TabLayout; 
import android.util.AttributeSet; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class CustomTabLayout extends TabLayout { 
    private Typeface mTypeface; 

    public CustomTabLayout(Context context) { 
     super(context); 
     init(); 
    } 

    public CustomTabLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    private void init() { 
     mTypeface = Typeface.createFromAsset(getContext().getAssets(), "your fonts"); // here you will provide fully qualified path for fonts 
    } 

    @Override 
    public void addTab(Tab tab) { 
     super.addTab(tab); 

     ViewGroup mainView = (ViewGroup) getChildAt(0); 
     ViewGroup tabView = (ViewGroup) mainView.getChildAt(tab.getPosition()); 

     int tabChildCount = tabView.getChildCount(); 
     for (int i = 0; i < tabChildCount; i++) { 
      View tabViewChild = tabView.getChildAt(i); 
      if (tabViewChild instanceof TextView) { 
       ((TextView) tabViewChild).setTypeface(mTypeface, Typeface.NORMAL); 
      } 
     } 
    } 

} 

这就是你必须在XML中做的事情。

<yourpackagename.CustomTabLayout 
    android:id="@+id/tabs" 
    app:tabGravity="fill" 
    app:tabMode="fixed" 
    android:background="@color/white" 
    app:tabIndicatorColor="@color/colorPrimary" 
    app:tabSelectedTextColor="@color/colorPrimary" 
    app:tabTextColor="@color/black" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

编辑

这种定制类

package com.ifavaz.kulli; 

/** 
* Created by ifawaz on 12/11/16. 
*/ 

import android.content.Context; 
import android.graphics.Typeface; 
import android.support.design.widget.TabLayout; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.widget.AppCompatTextView; 
import android.util.AttributeSet; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class CustomTabLayout extends TabLayout { 
    private Typeface mTypeface; 

    public CustomTabLayout(Context context) { 
     super(context); 
     init(); 
    } 

    public CustomTabLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    private void init() { 
     mTypeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/AmazingDayEveryday.ttf"); // here you will provide fully qualified path for fonts 
    } 

    @Override 
    public void setupWithViewPager(ViewPager viewPager) { 
     super.setupWithViewPager(viewPager); 

     if (mTypeface != null) { 
      this.removeAllTabs(); 
      ViewGroup slidingTabStrip = (ViewGroup) getChildAt(0); 

      PagerAdapter adapter = viewPager.getAdapter(); 

      for (int i = 0, count = adapter.getCount(); i < count; i++) { 
       Tab tab = this.newTab(); 
       this.addTab(tab.setText(adapter.getPageTitle(i))); 
       AppCompatTextView view = (AppCompatTextView) ((ViewGroup) slidingTabStrip.getChildAt(i)).getChildAt(1); 
       view.setTypeface(mTypeface, Typeface.NORMAL); 
      } 
     } 
    } 

} 

这里工作截图enter image description here

我希望这将有助于你

+0

“然后在XML中使用此CustomTablayout代替Tablayout“.... H我该怎么做 –

+0

我编辑了我的答案 –

+0

仍然无效。我正试图弄清楚这一点。在XML android:id =“@ + id/tabs”是指“标签”。在CustomTabLayout.java中,“public void addTab(Tab tab)”...应该最后一个“tab”是“tabs”吗?或者是你的代码是正确的? –