在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/,里面可以存放各种字体,百种字体百样甜,甜到让你根本停不下来!
最后的结果如下图:
由于本人开发之处,此文难免有不足之处,欢迎大家提出批评及修改意见!