如何根据用户需求更改我的应用程序的字体样式

时间:2013-09-18 07:03:47

标签: android android-layout fonts

我正在创建一个Android应用程序,我想添加一个选项,用户可以在其中更改我的应用程序的字体(字体样式)。 我想要一个更改字体样式按钮,当用户点击它时,他们可以看到一些字体样式的列表以及他们从该列表中选择的任何字体样式然后我希望整个应用程序文本根据该更改字体样式。 我想要你们的帮助。 我可以轻松完成整个程序吗? 在此先感谢。

6 个答案:

答案 0 :(得分:1)

我通过以下代码实现了这一目标:

   //Put font in asset/fonts folder

   String fontPath = "fonts/FONTNAME.TTF";

   // Loading Font Face
   Typeface typeface = Typeface.createFromAsset(getAssets(), fontPath);
    textview.setTypeface(typeface ); //setting font to particular view

希望它对你有用。

答案 1 :(得分:0)

这可以帮助您将字体应用于当前应用

访问http://www.androidguys.com/2008/08/18/fun-with-fonts/

答案 2 :(得分:0)

我已经完成了如下操作,

首先在资源文件夹中存储一些扩展名为ttf的字体。

然后在您的工作活动中将字体从资产变为变量。

然后在ListView或微调器或应用程序中的任何内容中设置它们。

创建一个字体对象。

之后,选择List项目的位置并将其设置为Typeface。

现在将此字体设置为应用程序中的文本,

答案 3 :(得分:0)

public class CustomFont extends Activity
{
ArrayList<String> fontsArrayList;
ListView font_list;

protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.custom_fonts); // Layout containing a listView with id fontListView

    fontsArrayList=new ArrayList<String>();
    addDataToArrayList();

    font_list=(ListView)findViewById(R.id.fontListView);
    font_list.setAdapter(new FontListAdapter());
    font_list.setOnItemClickListener(FontSelected);
}

private void addDataToArrayList()
{
    fontsArrayList.add("Sans Serif");
    fontsArrayList.add("Droid Mono Space");
    fontsArrayList.add("Serif");
    fontsArrayList.add("Acid Structure");
            fontsArrayList.add("Ananda Neptouch");
//Other Fonts you wish to add
}

OnItemClickListener FontSelected=new OnItemClickListener()
{

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long arg3) 
{
    Typeface typeFace = SetTextAppearance.getFont(getAssets(), fontsArrayList.get(position));

  // You can get the font name from arraylist
     /* String fontName = fontsArrayList.get(position); */

// You can use the typeface for changing the font where you wish like
    /* textView.setTypeface(typeFace); */

}
};


// Adapter for ListView
public class FontListAdapter extends BaseAdapter
{


@Override
public int getCount() {
    // TODO Auto-generated method stub
    return fontsArrayList.size();
}

@Override
public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View list=convertView;
    if(convertView==null)
    {
        LayoutInflater inflator=getLayoutInflater();
        list=inflator.inflate(R.layout.list_item, null); // Another Layout to be inflated as row for ListView. I have added a single textView in the layout
    }
    else
        list=(View)convertView;
    TextView textView=(TextView)list.findViewById(R.id.FontNameText);
    textView.setText(fontsArrayList.get(position));
    Typeface typeFace = SetTextAppearance.getFont(getAssets(), fontsArrayList.get(position));
    textView.setTypeface(typeFace);
    return list;
}

}

}

public class SetTextAppearance 
{
static AssetManager asm;

public static Typeface getFont(AssetManager mgr ,String fontName)
{
    Typeface typeFace = null;
    if (fontName.equals("Sans Serif")) {
        typeFace = Typeface.SANS_SERIF;
    }
    if (fontName.equals("Droid Mono Space")) {
        typeFace = Typeface.MONOSPACE;
    }
    if (fontName.equals("Serif")) {
        typeFace = Typeface.SERIF;
    }
    if (fontName.equals("Acid Structure")) {
        typeFace = Typeface.createFromAsset(mgr,"fonts/"+"acidstructure.ttf");
    }
    if (fontName.equals("Ananda Neptouch")) {
        typeFace = Typeface.createFromAsset(mgr,"fonts/"+"ananda_neptouch.ttf");
    }
}
}

确保已在资产/字体

中导入字体文件(.ttf)

答案 4 :(得分:0)

首先,要创建一个应用了所有字体的listView,你必须制作一个适配器,在getView()方法中返回一个带右边的TextView

将字体应用于我所做的每个视图:

  • .ttf forlder
  • 中存储您需要的/assets个文件
  • 将它们加载到内存中,如下所示:

    Typeface font = Typeface.createFromAsset(c.getAssets(), "font.ttf");

  • getView (int position, View convertView, ViewGroup parent)方法中创建一个适配器,返回一个TextView,其中包含根据位置应用的字体。

  • onItemClick以递归的方式将正确的字体应用于所有TextView(或支持Typeface的每个视图)

    public void setTypefaceRecursive( View view, Typeface typeface ) {
        if( typeface == null )
            return;
    
        if( view instanceof ViewGroup ) {
            //set the typeface to all the sub views
            ViewGroup parent = (ViewGroup)view;
            for( int i = 0; i < parent.getChildCount(); i++ )
                setTypefaceRecursive( parent.getChildAt(i), typeface );
        } else if( view instanceof TextView ) {
            ((TextView) view).setTypeface(typeface);
        }
    }
    
  • Typeface对象全局存储在某个位置并将其应用于您要膨胀/实例的每个视图树。

关于我没有做的事情是你可以使用反射将Typeface设置为可能具有setTypeface(Typeface typface)方法的所有视图。

    try {
        view.getClass().getMethod("setTypeface", Typeface.class ).invoke(view, typeface);
    }catch( NoSuchMethodException e ) {}

答案 5 :(得分:0)

为自定义字体创建一个类,并将其扩展为TextView,如下所示

public class CustomTextView extends TextView {

public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

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

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

@SuppressWarnings("null")
private void init() {
    if (!isInEditMode()) {

        String fontName = null;// get your fontName here 
        // default style
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
                "helveticaneue_bold.ttf");

        /*
         * Check User Selected font style
         * */

        if (fontName.equals("Sans Serif")) {
            tf = Typeface.createFromAsset(getContext().getAssets(),
                    "sans_serif.ttf");
        }
        if (fontName.equals("Droid Mono Space")) {
            tf = Typeface.createFromAsset(getContext().getAssets(),
                    "droid_mono_space.ttf");
        }
        if (fontName.equals("Serif")) {
            tf = Typeface.createFromAsset(getContext().getAssets(),
                    "serif.ttf");
        }

        setTypeface(tf);
    }
}

}

现在在您的每个xml而不是TextView中使用此类,如下所示

  <yourpackagename.CustomTextView
            android:id="@+id/tv_title"
            style="@style/buttontext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/company_profile" >
        </yourpackagename.CustomTextView>

现在,在每个事件上单击以更改样式,在init()方法中获取所选字体样式的实例,这样做。另外别忘了把你的字体样式(.ttf)放到资源文件夹中。