Android 在“ImageAdapter扩展BaseAdapter”中设置自定义字体`

Android 在“ImageAdapter扩展BaseAdapter”中设置自定义字体`,android,gridview,fonts,adapter,Android,Gridview,Fonts,Adapter,我正在使用ImageAdapter extensed BaseAdapter为gridview充气。Gridview有两个textviews。我想为其中一个设置自定义字体。使用Typeface font=Typeface.createFromAsset(getAssets(),“BABYCAKE.TTF”)给出错误类型ImageAdapter的getAssets()方法未定义 ImageAdapter定义为 package com.amit.wozzle; import java.util.A

我正在使用
ImageAdapter extensed BaseAdapter
gridview
充气。Gridview有两个
textview
s。我想为其中一个设置自定义字体。使用
Typeface font=Typeface.createFromAsset(getAssets(),“BABYCAKE.TTF”)ImageAdapter
中的code>给出错误
类型ImageAdapter的getAssets()方法未定义

ImageAdapter
定义为

package com.amit.wozzle;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.view.LayoutInflater;

public class ImageAdapter extends BaseAdapter
{  
private ArrayList<String> listCountry;  
private ArrayList<String> scorestage;  
private Activity activity;  
Typeface font;

public ImageAdapter(Activity activity,ArrayList<String> listCountry, ArrayList<String> scorestage) {  
    super();  
    this.listCountry = listCountry;  
    this.scorestage = scorestage;  
    this.activity = activity;  
    font = Typeface.createFromAsset(activity.getAssets(), "BABYCAKE.TTF");
}  

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

@Override  
public String getItem(int position) {  
    // TODO Auto-generated method stub  
    return listCountry.get(position);  
}  

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

public static class ViewHolder  
{  
    public ImageView imgViewFlag;  
    public TextView  txtViewTitle; 
    public TextView  txtViewTitle2; 
}  

@Override  
public View getView(int position, View convertView, ViewGroup parent) {  
    // TODO Auto-generated method stub  
    ViewHolder view;  
    LayoutInflater inflator = activity.getLayoutInflater();  

    if(convertView==null)  
    {  
        view = new ViewHolder();  
        convertView = inflator.inflate(R.layout.grid_item, null);  
        view.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1);  
        view.txtViewTitle2.setTypeface(font);
        view.txtViewTitle2 = (TextView) convertView.findViewById(R.id.textView2);  

        // view.imgViewFlag = (ImageView) convertView.findViewById(R.id.imageView1);  
        convertView.setTag(view);  
    }  
    else  
    {  
        view = (ViewHolder) convertView.getTag();  
    }  
    // view.txtViewTitle2.setBackgroundColor(Color.BLUE);
    view.txtViewTitle2.setText(listCountry.get(position)); 
    view.txtViewTitle.setText(scorestage.get(position)); 
    // view.imgViewFlag.setImageResource(scorestage.get(position));  

    return convertView;  
}  
}
package com.amit.wozzle;
导入java.util.ArrayList;
导入android.app.Activity;
导入android.content.Context;
导入android.graphics.Color;
导入android.graphics.Typeface;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.GridView;
导入android.widget.ImageView;
导入android.widget.TextView;
导入android.view.LayoutInflater;
公共类ImageAdapter扩展了BaseAdapter
{  
私有ArrayList列表国家;
私人ArrayList scorestage;
私人活动;
字体;
公共ImageAdapter(活动活动、ArrayList listCountry、ArrayList scorestage){
超级();
this.listCountry=listCountry;
this.scorestage=scorestage;
这个。活动=活动;
font=Typeface.createFromAsset(activity.getAssets(),“BABYCAKE.TTF”);
}  
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回listCountry.size();
}  
@凌驾
公共字符串getItem(int位置){
//TODO自动生成的方法存根
返回listCountry.get(位置);
}  
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}  
公共静态类视图持有者
{  
公共图像视图imgViewFlag;
公共文本视图txtViewTitle;
公共文本视图txtViewTitle2;
}  
@凌驾
公共视图getView(int位置、视图转换视图、视图组父级){
//TODO自动生成的方法存根
视图持有者视图;
LayoutFlater充气器=活动。GetLayoutFlater();
if(convertView==null)
{  
视图=新的ViewHolder();
convertView=充气机。充气(R.layout.grid_项,空);
view.txtViewTitle=(TextView)convertView.findViewById(R.id.textView1);
view.txtViewTitle2.setTypeface(字体);
view.txtViewTitle2=(TextView)convertView.findViewById(R.id.textView2);
//view.imgViewFlag=(ImageView)convertView.findViewById(R.id.imageView1);
setTag(视图);
}  
其他的
{  
view=(ViewHolder)convertView.getTag();
}  
//view.txtViewTitle2.setBackgroundColor(Color.BLUE);
view.txtViewTitle2.setText(listCountry.get(position));
view.txtViewTitle.setText(scorestage.get(position));
//view.imgViewFlag.setImageResource(scorestage.get(position));
返回视图;
}  
}
请帮忙。

试试看

Typeface font = Typeface.createFromAsset(activity.getAssets(), "BABYCAKE.TTF");

为什么要在
getView
中创建
Typeface
对象<代码>字体
占用大量内存,而且由于在
getView
中创建了大量字体对象,因此可用的内存空间会减少,因此会降低应用程序的速度

相反,字体文件应该只创建一次,并在需要时重新使用。在
getView
之外创建字体文件。如果您仅在适配器内部使用它并在适配器构造函数内部初始化它,请将其声明为适配器内部的实例变量。而不是每次在getView中创建新实例,而是使用单个实例来设置字体

对于错误,请使用活动实例变量调用
getAssets()

编辑- 试着像这样使用它-

class DemoFonts{
    private static TypeFace typeFace;   
    public static TypeFace getTypeFace(Context mContext){
        if(typeface==null){
            typeface = Typeface.createFromAsset(mContext.getAssets(), "fonts/BABYCAKE.TTF");
        }

        return typeface;
    }

}

试着像上面那样使用。假设您在资产文件夹中有
font
文件夹。

view.txtViewTitle2由于您试图在初始化之前访问textView,因此出现空指针异常。下面的更改应该可以正常工作

view.txtViewTitle2 = (TextView) convertView.findViewById(R.id.textView2)
view.txtViewTitle2.setTypeface(font);

按照你的建议做了改动。是的,现在看起来不错。另外,如果你在其他地方使用这种字体,你也可以在某个实用程序类中将它声明为静态变量,并在任何地方使用它。你能解释一下怎么做吗。我正在其他活动中使用它。我已修改我的答案,请检查。此外,如果您在资产文件夹中放置了字体文件,请在使用该文件夹名称的同时将字体文件设置为“我的代码”。
demofont
将是内部类,或者是新的java类。如果它是一个新类,那么我可以在任何活动中直接使用变量
字体
?我试过了,请看上面的代码。在
view.txtViewTitle2.setTypeface(字体)行获取空指针错误
getView
方法中。字体文件确实存在,我正在其他活动中使用它。
view.txtViewTitle2 = (TextView) convertView.findViewById(R.id.textView2)
view.txtViewTitle2.setTypeface(font);