在ListView中使用外带字体

在ListView中使用外带字体

根据Android手机开发的基础教程以及自入门以来,使用以下代码来实现ListView的显示如下:
①app/src/main/res/layout/listview_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="5dp">
    <ImageView
        android:id="@+id/myImageView1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"/>
    <TextView
        android:id="@+id/myTextView1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:layout_weight="3"
        android:layout_gravity="center_vertical"/>
    <TextView
        android:id="@+id/myTextView2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="示例"
        android:textSize="15dp"
        android:layout_gravity="center_vertical"/>
</LinearLayout>

②app/src/main/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.demo.android.listviewapplication.MainActivity">

    <TextView
        android:id="@+id/myTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    <ListView
        android:id="@+id/myListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></ListView>
</LinearLayout>

③app/src/main/java/com/demo/android/listviewapplication/MainActivity.java

package com.demo.android.listviewapplication;

import android.app.Activity;
import android.app.ListActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends Activity {
    
    

    private ListView myListView;
    List<Map<String, Object>> mList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myListView = (ListView) findViewById(R.id.myListView);

        ArrayAdapter<CharSequence> arrayAdapter =
                ArrayAdapter.createFromResource(this, R.array.lyrics,
                        android.R.layout.simple_list_item_1);

        String[] lyricsFromResources = getResources().getStringArray(R.array.lyrics);
        mList = new ArrayList<Map<String, Object>>();
        for (int i = 0; i < lyricsFromResources.length; i++) {
            Map<String, Object> item = new HashMap<String, Object>();
            item.put("imgView", android.R.drawable.ic_menu_my_calendar);
            item.put("txtView", lyricsFromResources[i]);
            mList.add(item);
        }

        SimpleAdapter adapter2 = new SimpleAdapter(
                this, mList, R.layout.listview_layout,
                new String[]{
   
   "imgView", "txtView"},
                new int[]{R.id.myImageView1, R.id.myTextView1}
        );
        myListView.setAdapter(adapter2);
    }
}

最后展示的结果如下图所示:
展示效果一
如第一个例子所举,虽然显示效果可以展示每一个项目的图片与文字,但有一个缺陷,那就是当开发人员没有自定义属性的时候,只能使用默认字体,不能使用Java代码来使用自备的外来字体。因此,不光要自定义属性,并且这类属性只有当开发人员使用由TextView继承而来的新类才可以使用。
以下是自定义属性的详细步骤。
第一步:先在res/values建立一个XML文件,这里以attributes.xml为例,不要求名称和本文一样。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="textView">
        <attr name="type_face_font" format="string" />
    </declare-styleable>
</resources>

其中,type_face_font为属性名称,format为属性所属的类型。
第二步,新建一个由TextView继承的类,这是为下一步建立自定义属性创造条件,否则,如果直接建立在TextView建立属性,编译时会报错。这里以CustomTextView命名。
第三步,将前文中提到的①listview_layout.xml改写如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:attributes="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="5dp">
    <ImageView
        android:id="@+id/myImageView1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"/>
    <com.demo.android.listviewapplication.CustomTextView
        android:id="@+id/myTextView1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        attributes:type_face_font="FZXKJW"
        android:layout_weight="3"
        android:layout_gravity="center_vertical"/>
    <com.demo.android.listviewapplication.CustomTextView
        android:id="@+id/myTextView2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="示例"
        android:textSize="15dp"
        attributes:type_face_font="FZCSK"
        android:layout_gravity="center_vertical"/>
</LinearLayout>

当然,新旧代码的差别,由读者细细品味,这里不再赘述。
第四步,在由TextView继承的CustomTextView.java中的某个构造函数中新建TypeFace变量,并通过它设置字体,尤其要注意属性名称。具体代码如下:

package com.demo.android.listviewapplication;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

/**
 * Created by androiduser on 2017/12/24.
 */

public class CustomTextView extends TextView {
    
    
    public CustomTextView(Context context) {
        super(context);
    }

    private String fontName;

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        int count = attrs.getAttributeCount();
        for (int i = 0; i < count; i++) {
            String attrName = attrs.getAttributeName(i);
            String attrVal = attrs.getAttributeValue(i);
            if (attrName.equals("type_face_font"))
                fontName = attrVal;
            Log.e("信息", "attrName = " + attrName + " , attrVal = " + attrVal);
        }

        if (fontName == null)
            fontName = "FZZYK";
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(),"fonts/" + fontName + ".TTF");
        super.setTypeface(tf);
    }

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

最后一步,别忘了在app文件下新建文件路径:assets/fonts/,里面可以存放各种字体,百种字体百样甜,甜到让你根本停不下来!
最后的结果如下图:
这里写图片描述
由于本人开发之处,此文难免有不足之处,欢迎大家提出批评及修改意见!

猜你喜欢

转载自blog.csdn.net/weixin_38307752/article/details/78884338