Android之——自定义复合控件的实现
来源:互联网 发布:project facets java 编辑:程序博客网 时间:2024/05/16 14:32
转载请注明出处: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() {@Overridepublic 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main);//创建ClearableEditText实例对象ClearableEditText editText = new ClearableEditText(this);//将显示的视图设置为ClearableEditText对象setContentView(editText);}@Overridepublic 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>
三、运行效果
程序运行
文本框输入数据
点击按钮清除文本框数据
四、温馨提示
本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。
大家可以到http://download.csdn.net/detail/l1028386804/8938835链接获取完整Android自定义复合控件源代码
- Android之——自定义复合控件的实现
- android自定义View之复合控件
- Android 自定义复合控件之通用标题栏
- 自定义控件之——创建复合控件
- Android自定义控件——创建复合控件
- android 自定义复合控件
- android自定义复合控件
- Android 自定义复合控件
- Android自定义view初步——定制复合控件
- Android自定义View之自定义复合控件--标题栏
- 【Android】创建自定义复合控件
- Android创建自定义复合控件
- 《Android 群英传》读书笔记:自定义 View 之创建复合控件
- 自定义控件之复合控件详解
- Android自定义控件封装之自定义属性的实现
- 自定义View 之 创建复合控件
- android自定义view(二)创建复合控件
- Android开发——自定义view之环形等待控件的实现
- ViewPager实现无限循环切换和手势滑动效果
- QWidget: must construct a QApplication before a QPaintDevice问题解决方法
- 基础问答
- 网络请求之GET、POST请求
- leetcode 061 —— Rotate List
- Android之——自定义复合控件的实现
- 安装tomcat服务
- JSVM使用简介
- 自定义PUSH POP跳转动画
- 【C/C++学院】0813-C与CPP不同以及命名空间简介/函数重载与函数默认参数/泛型auto/Newdelete
- Spring MVC学习--------------请求映射到action的方法
- 存储引擎浅谈
- 程序员,千万不要重写代码
- meta标签