Android之——自定义复合控件的实现

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47101387

有一定Android开发经验的童鞋都知道,有时候Android提供的原生视图无法满足我们自己项目的业务需求,这就需要我们自己去自定义Android控件了,在很多情况下,需要我们自己去将很多控件(Android原生控件,自定义控件)组合起来,生成一个新的视图来满足我们自己项目的业务需求。好了,本文就是向大家介绍如何自定义Android复合控件,我在这篇文章中,以一个文本框和按钮组合成一个复合控件来向大家介绍如何实现Android中的自定义复合控件的功能。在这个示例中,点击按钮,实现清空文本框数据的功能,好了,咱们还是直接进入主题吧。

一、原理

复合控件即是指不可分割的,自包含的试图组,其中包含了多个排列和连接在一起的子视图。当创建复合控件时,必须对它包含的视图的布局,外观和交互进行定义。复合控件时通过扩展一个ViewGroup(通常是一个布局)来创建的。因此,要创建一个新的复合控件,首先要选择一个最适合放置子控件的布局类,然后扩展该类。

二、实现

1、创建布局文件

在res/layout目录下创建布局文件fuhe_item.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="wrap_content"
    android:orientation="vertical" >
    <EditText 
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text"/>
	<Button 
	    android:id="@+id/clearButton"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:text="Clear"/>
</LinearLayout>

2、创建自定义控件类ClearableEditText

这个类继承自LinearLayout,在这个类中引用上面的布局文件,我们对这个类的构造函数进行重写,并使用LayoutInflater系统服务中的inflate方法来填充布局资源。inflate方法可以接收一个布局资源,然后返回一个已经被填充的视图。

对于一些特殊情况,例如,返回的视图应该是正在创建的类,可以传入一个父视图,然后自动的把结果附加给它。

我们这个类中,在构造方法中,填充了布局资源,并得到了它包含的文本框和按钮控件,并调用了hookupButton方法,在hookupButton方法中实现点击按钮清除文本框数据并提示用户"文本框数据已经清楚"的功能。

具体实现如代码所示:

package com.lyz.fuhe.activity;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;

/**
 * 自定义复合布局
 * @author liuyazhuang
 *
 */
public class ClearableEditText extends LinearLayout {
	//文本框
	private EditText editText;
	//按钮
	private Button clearButton;
	public ClearableEditText(Context context) {
		super(context);
		//使用布局资源填充视图
		LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		//加载布局文件
		mInflater.inflate(R.layout.fuhe_item, this, true);
		this.editText = (EditText) findViewById(R.id.editText);
		this.clearButton = (Button) findViewById(R.id.clearButton);
		hookupButton(context);
	}
	/**
	 * button处理程序
	 */
	private void hookupButton(final Context context) {
		this.clearButton.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				editText.setText("");
				Toast.makeText(context, "文本框数据已清除", Toast.LENGTH_SHORT).show();
			}
		});
	}

}

3、修改MainActivity类

这个类的修改很简单,我们只需要在onCreate()方法中将原有的setContentView()方法设置的视图修改为我们自己定义的ClearableEditText对象。

具体实现代码如下:

package com.lyz.fuhe.activity;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

/**
 * 程序入口MainActivity
 * @author liuyazhuang
 *
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.activity_main);
		//创建ClearableEditText实例对象
		ClearableEditText editText = new ClearableEditText(this);
		//将显示的视图设置为ClearableEditText对象
		setContentView(editText);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

4、AndroidManifest.xml

这个示例中,不需要提供任何其他权限类实现,AndroidManifest.xml文件的内容都是Android自动生成的。

具体实现代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lyz.fuhe.activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.lyz.fuhe.activity.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

三、运行效果

程序运行

Android之——自定义复合控件的实现_第1张图片

文本框输入数据

Android之——自定义复合控件的实现_第2张图片

点击按钮清除文本框数据

Android之——自定义复合控件的实现_第3张图片

四、温馨提示

本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。

大家可以到http://download.csdn.net/detail/l1028386804/8938835链接获取完整Android自定义复合控件源代码

你可能感兴趣的:(android,自定义,布局,控件)