在预构建组件中实现自己的组件,扩展子类具有自己定义的类
Android提供了一个很棒的预构建小部件列表,如Button,您可以直接在Android应用程序开发中使用TextView,EditText,ListView,CheckBox,RadioButton,Gallery,Spinner,AutoCompleteTextView等,但是当您对任何可用小部件的现有功能不满意时,可能会出现这种情况. Android为您提供了创建自定义组件的方法,您可以根据自己的需要对其进行自定义.
如果您只需对现有小部件或布局进行小幅调整,则可以简单地进行子类化小部件或布局并覆盖其方法,这将使您可以精确控制屏幕元素的外观和功能.
本教程将向您介绍如何创建自定义视图并在应用程序中使用它们使用简单易行的步骤.
自定义视图层次结构中自定义组件的示例
创建简单自定义组件
Step | 描述 |
---|---|
1 | 您将使用Android studio IDE创建Android应用程序并将其命名为在 com.example.it13527.myapplication 下的 myapplication ,如 Hello World示例章节中所述. |
2 | 创建XML res/values/attrs.xml 文件,用于定义新属性及其数据类型. |
3 | 创建 src/mainactivity.java 文件并添加代码以定义自定义组件 |
4 | 修改 res/layout/activity_main.xml 文件并添加代码以创建彩色复合视图实例以及一些默认属性和新属性. |
5 | 运行应用程序以启动Android模拟器,并验证应用程序中所做更改的结果. |
在您中创建名为attrs.xml的以下属性文件r res/values文件夹.
将活动使用的布局文件更改为以下内容.
为您的复合视图创建以下名为timeview的java文件.
package com.example.it13527.myapplication;import java.text.SimpleDateFormat;import java.util.Calendar;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Color;import android.util.AttributeSet;import android.widget.TextView;public class TimeView extends TextView { private String titleText; private boolean color; public TimeView(Context context) { super(context); setTimeView(); } public TimeView(Context context, AttributeSet attrs) { super(context, attrs); // retrieved values correspond to the positions of the attributes TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TimeView); int count = typedArray.getIndexCount(); try{ for (int i = 0; i < count; ++i) { int attr = typedArray.getIndex(i); // the attr corresponds to the title attribute if(attr == R.styleable.TimeView_title) { // set the text from the layout titleText = typedArray.getString(attr); setTimeView(); } else if(attr == R.styleable.TimeView_setColor) { // set the color of the attr "setColor" color = typedArray.getBoolean(attr, false); decorateText(); } } } // the recycle() will be executed obligatorily finally { // for reuse typedArray.recycle(); } } public TimeView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setTimeView(); } private void setTimeView() { // has the format hour.minuits am/pm SimpleDateFormat dateFormat = new SimpleDateFormat("hh.mm aa"); String time = dateFormat.format(Calendar.getInstance().getTime()); if(this.titleText != null ) setText(this.titleText+" "+time); else setText(time); } private void decorateText() { // when we set setColor attribute to true in the XML layout if(this.color == true){ // set the characteristics and the color of the shadow setShadowLayer(4, 2, 2, Color.rgb(250, 00, 250)); setBackgroundColor(Color.CYAN); } else { setBackgroundColor(Color.RED); } }}
将您的主要活动java文件更改为以下代码并运行您的应用程序.
package com.example.it13527.myapplication;import android.os.Bundle;import android.widget.TextView;import android.app.Activity;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView simpleText = (TextView) findViewById(R.id.simple); simpleText.setText("That is a simple TextView"); }}
正在运行的应用程序应如下所示.