我正在制作一个 android 应用程序,我想添加一个选项,用户可以在其中更改我的应用程序的字体(字体样式)。我想要一个更改字体样式按钮,当用户单击它时,他们可以看到一些字体样式的列表以及他们从该列表中选择的任何字体样式,然后我希望整个应用程序文本根据该字体样式进行更改。我需要你们的帮助。我能以一种简单的方式完成整个过程吗?提前致谢。
6 回答
我通过这段代码实现了这一点:
//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
希望它对你有用。
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");
}
}
}
确保您已在 assets/fonts 中导入字体文件 (.ttf)
我已经这样做了,如下所示,
ttf
首先在您的资产文件夹中存储一些带有扩展名的字体。
然后在您的工作活动中将字体从资产中获取到变量中。
然后将它们设置在 ListView 或 spinner 或任何您想要的应用程序中。
创建一个字体对象。
之后获取选定列表项的位置并将其设置为字体。
现在将此字体设置为应用程序中的文本,
为自定义字体创建一个类并将其扩展到 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) 放入 assets 文件夹。
首先,要创建一个应用了所有字体的列表视图,您必须创建一个适配器,该适配器在该getView()
方法中返回一个正确的 TextView
将字体应用于我所做的everyview:
- 将
.ttf
您需要的文件存储在您的文件/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); } }
将字体对象全局存储在某处,并将其应用于您将膨胀/实例化的每个视图树。
我没有做的事情是您可以使用反射将字体设置为所有可能具有setTypeface(Typeface typface)方法的视图。
try {
view.getClass().getMethod("setTypeface", Typeface.class ).invoke(view, typeface);
}catch( NoSuchMethodException e ) {}
这可以帮助您将字体应用到当前应用