Android(安卓)自定义组件

用自己定义的类扩展子类,在预内置组件中实现自己的组件。

Android 提供了一系列预构建的小部件,如 Button、TextView、EditText、ListView、CheckBox、RadioButton、Gallery、Spinner、AutoCompleteTextView 等,您可以直接在 Android 应用程序开发中使用,但可能会出现您对任何可用小部件的现有功能不满意的情况。Android 为您提供了创建自定义组件的方法,您可以自定义这些组件以满足您的需求。

如果您只需要对现有的小部件或布局进行小的调整,您可以简单地对小部件或版面进行子类化,并覆盖其方法,这将使您能够精确控制屏幕元素的外观和功能。

本教程介绍了如何创建自定义视图,并使用简单易行的步骤在应用程序中使用它们。

自定义视图层次结构中的自定义组件实例


创建简单自定义组件

步骤描述
1您将使用 Android studio IDE 创建一个 Android 应用程序,并将其命名为 com.example.demo.myapplication,如 Hello World 实例一章所述。
2创建一个XML res/values/attrs.xml 文件,以定义新属性及其数据类型。
3创建 src/mainactivity.java 文件并添加代码以定义自定义组件。
4修改 res/layout/activity_main.xml 文件,并添加代码以创建 Colour 复合视图实例以及一些默认属性和新属性。
5运行应用程序以启动 Android 模拟器并验证应用程序中所做更改的结果。

res/values 文件夹中创建以下名为 attrs.xml 的属性文件。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="TimeView">
  4. <declare-styleable name="TimeView">
  5. <attr name="title" format="string" />
  6. <attr name="setColor" format="boolean"/>
  7. </declare-styleable>
  8. </declare-styleable>
  9. </resources>

将活动使用的布局文件更改为以下内容。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. xmlns:custom="http://schemas.android.com/apk/res-auto"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity" >
  8. <com.example.demo.myapplication.TimeView
  9. android:id="@+id/timeView"
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content"
  12. android:textColor="#fff"
  13. android:textSize="40sp"
  14. custom:title="my time view"
  15. custom:setColor="true" />
  16. <TextView
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:id="@+id/simple"
  20. android:layout_below="@id/timeView"
  21. android:layout_marginTop="10dp" />
  22. </RelativeLayout>

为复合视图创建以下名为 timeview 的 java 文件。

  1. package com.example.demo.myapplication;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Calendar;
  4. import android.content.Context;
  5. import android.content.res.TypedArray;
  6. import android.graphics.Color;
  7. import android.util.AttributeSet;
  8. import android.widget.TextView;
  9. public class TimeView extends TextView {
  10. private String titleText;
  11. private boolean color;
  12. public TimeView(Context context) {
  13. super(context);
  14. setTimeView();
  15. }
  16. public TimeView(Context context, AttributeSet attrs) {
  17. super(context, attrs);
  18. // retrieved values correspond to the positions of the attributes
  19. TypedArray typedArray = context.obtainStyledAttributes(attrs,
  20. R.styleable.TimeView);
  21. int count = typedArray.getIndexCount();
  22. try{
  23. for (int i = 0; i < count; ++i) {
  24. int attr = typedArray.getIndex(i);
  25. // the attr corresponds to the title attribute
  26. if(attr == R.styleable.TimeView_title) {
  27. // set the text from the layout
  28. titleText = typedArray.getString(attr);
  29. setTimeView();
  30. } else if(attr == R.styleable.TimeView_setColor) {
  31. // set the color of the attr "setColor"
  32. color = typedArray.getBoolean(attr, false);
  33. decorateText();
  34. }
  35. }
  36. }
  37. // the recycle() will be executed obligatorily
  38. finally {
  39. // for reuse
  40. typedArray.recycle();
  41. }
  42. }
  43. public TimeView(Context context, AttributeSet attrs, int defStyle) {
  44. super(context, attrs, defStyle);
  45. setTimeView();
  46. }
  47. private void setTimeView() {
  48. // has the format hour.minuits am/pm
  49. SimpleDateFormat dateFormat = new SimpleDateFormat("hh.mm aa");
  50. String time = dateFormat.format(Calendar.getInstance().getTime());
  51. if(this.titleText != null )
  52. setText(this.titleText+" "+time);
  53. else
  54. setText(time);
  55. }
  56. private void decorateText() {
  57. // when we set setColor attribute to true in the XML layout
  58. if(this.color == true){
  59. // set the characteristics and the color of the shadow
  60. setShadowLayer(4, 2, 2, Color.rgb(250, 00, 250));
  61. setBackgroundColor(Color.CYAN);
  62. } else {
  63. setBackgroundColor(Color.RED);
  64. }
  65. }
  66. }

Main 活动 java 文件更改为以下代码并运行应用程序。

  1. package com.example.demo.myapplication;
  2. import android.os.Bundle;
  3. import android.widget.TextView;
  4. import android.app.Activity;
  5. public class MainActivity extends Activity {
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. TextView simpleText = (TextView) findViewById(R.id.simple);
  11. simpleText.setText("That is a simple TextView");
  12. }
  13. }

正在运行的应用程序应如以下屏幕截图所示。