转载请注明出处: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>
三、运行效果
程序运行
文本框输入数据
点击按钮清除文本框数据
四、温馨提示
本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。
大家可以到http://download.csdn.net/detail/l1028386804/8938835链接获取完整Android自定义复合控件源代码
版权声明:本文为博主原创文章,未经博主允许不得转载。