【转】android UI进阶之自定义组合控件

[源地址]http://blog.csdn.net/notice520/article/details/6667827

好久没写博客了。实在是忙不过来,不过再不总结总结真的不行了。慢慢来吧,有好多需要去总结的,博客里还是记录ui方面的。

今天和大家分享下组合控件的使用。很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便的一个方法。今天就来介绍下如何使用组合控件,将通过两个实例来介绍。

第一个实现一个带图片和文字的按钮,如图所示:

整个过程可以分四步走。第一步,定义一个layout,实现按钮内部的布局。代码如下:

[html] view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <ImageView
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:id="@+id/iv"
  11. android:src="@drawable/confirm"
  12. android:paddingTop="5dip"
  13. android:paddingBottom="5dip"
  14. android:paddingLeft="40dip"
  15. android:layout_gravity="center_vertical"
  16. />
  17. <TextView
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:text="确定"
  21. android:textColor="#000000"
  22. android:id="@+id/tv"
  23. android:layout_marginLeft="8dip"
  24. android:layout_gravity="center_vertical"
  25. />
  26. </LinearLayout>

  这个xml实现一个左图右字的布局,接下来写一个类继承LinearLayout,导入刚刚的布局,并且设置需要的方法,从而使的能在代码中控制这个自定义控件内容的显示。代码如下:

[java] view plain copy

  1. package com.notice.ib;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.view.LayoutInflater;
  5. import android.widget.ImageView;
  6. import android.widget.LinearLayout;
  7. import android.widget.TextView;
  8. public class ImageBt extends LinearLayout {
  9. private ImageView iv;
  10. private TextView  tv;
  11. public ImageBt(Context context) {
  12. this(context, null);
  13. }
  14. public ImageBt(Context context, AttributeSet attrs) {
  15. super(context, attrs);
  16. // 导入布局
  17. LayoutInflater.from(context).inflate(R.layout.custombt, this, true);
  18. iv = (ImageView) findViewById(R.id.iv);
  19. tv = (TextView) findViewById(R.id.tv);
  20. }
  21. /**
  22. * 设置图片资源
  23. */
  24. public void setImageResource(int resId) {
  25. iv.setImageResource(resId);
  26. }
  27. /**
  28. * 设置显示的文字
  29. */
  30. public void setTextViewText(String text) {
  31. tv.setText(text);
  32. }
  33. }

 第三步,在需要使用这个自定义控件的layout中加入这控件,只需要在xml中加入即可。方法如下:

[html] view plain copy

  1. <RelativeLayout
  2. android:orientation="horizontal"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:layout_gravity="bottom"
  6. >
  7. <com.notice.ib.ImageBt
  8. android:id="@+id/bt_confirm"
  9. android:layout_height="wrap_content"
  10. android:layout_width="wrap_content"
  11. android:layout_alignParentBottom="true"
  12. android:background="@drawable/btbg"
  13. android:clickable="true"
  14. android:focusable="true"
  15. />
  16. <com.notice.ib.ImageBt
  17. android:id="@+id/bt_cancel"
  18. android:layout_toRightOf="@id/bt_confirm"
  19. android:layout_height="wrap_content"
  20. android:layout_width="wrap_content"
  21. android:layout_alignParentBottom="true"
  22. android:background="@drawable/btbg"
  23. android:clickable="true"
  24. android:focusable="true"
  25. />
  26. </RelativeLayout>

注意的是,控件标签使用完整的类名即可。为了给按钮一个点击效果,你需要给他一个selector背景,这里就不说了。

  最后一步,即在activity中设置该控件的内容。当然,在xml中也可以设置,但是只能设置一个,当我们需要两次使用这样的控件,并且显示内容不同时就不行了。在activity中设置也非常简单,我们在ImageBt这个类中已经写好了相应的方法,简单调用即可。代码如下:

[java] view plain copy

  1. public class MainActivity extends Activity {
  2. private ImageBt ib1;
  3. private ImageBt ib2;
  4. /** Called when the activity is first created. */
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.login);
  9. ib1 = (ImageBt) findViewById(R.id.bt_confirm);
  10. ib2 = (ImageBt) findViewById(R.id.bt_cancel);
  11. ib1.setTextViewText("确定");
  12. ib1.setImageResource(R.drawable.confirm);
  13. ib2.setTextViewText("取消");
  14. ib2.setImageResource(R.drawable.cancel);
  15. ib1.setOnClickListener(new OnClickListener() {
  16. @Override
  17. public void onClick(View v) {
  18. //在这里可以实现点击事件
  19. }
  20. });
  21. }
  22. }

 这样,一个带文字和图片的组合按钮控件就完成了。这样梳理一下,使用还是非常简单的。组合控件能做的事还非常多,主要是在类似上例中的ImageBt类中写好要使用的方法即可。

再来看一个组合控件,带删除按钮的EidtText。即在用户输入后,会出现删除按钮,点击即可取消用户输入。

定义方法和上例一样。首先写一个自定义控件的布局:

[html] view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. >
  6. <EditText
  7. android:id="@+id/et"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:singleLine="true"
  11. />
  12. <ImageButton
  13. android:id="@+id/ib"
  14. android:visibility="gone"
  15. android:src="@drawable/menu_delete"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:background="#00000000"
  19. android:layout_alignRight="@+id/et" />
  20. </RelativeLayout>

实现输入框右侧带按钮效果,注意将按钮隐藏。然后写一个EditCancel类,实现删除用户输入功能。这里用到了TextWatch这个接口,监听输入框中的文字变化。使用也很简单,实现他的三个方法即可。看代码:

[java] view plain copy

  1. package com.notice.ce;
  2. import android.content.Context;
  3. import android.text.Editable;
  4. import android.text.TextWatcher;
  5. import android.util.AttributeSet;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.widget.EditText;
  9. import android.widget.ImageButton;
  10. import android.widget.LinearLayout;
  11. public class EditCancel extends LinearLayout implements EdtInterface {
  12. ImageButton ib;
  13. EditText    et;
  14. public EditCancel(Context context) {
  15. super(context);
  16. }
  17. public EditCancel(Context context, AttributeSet attrs) {
  18. super(context, attrs);
  19. LayoutInflater.from(context).inflate(R.layout.custom_editview, this, true);
  20. init();
  21. }
  22. private void init() {
  23. ib = (ImageButton) findViewById(R.id.ib);
  24. et = (EditText) findViewById(R.id.et);
  25. et.addTextChangedListener(tw);// 为输入框绑定一个监听文字变化的监听器
  26. // 添加按钮点击事件
  27. ib.setOnClickListener(new OnClickListener() {
  28. @Override
  29. public void onClick(View v) {
  30. hideBtn();// 隐藏按钮
  31. et.setText("");// 设置输入框内容为空
  32. }
  33. });
  34. }
  35. // 当输入框状态改变时,会调用相应的方法
  36. TextWatcher tw = new TextWatcher() {
  37. @Override
  38. public void onTextChanged(CharSequence s, int start, int before, int count) {
  39. // TODO Auto-generated method stub
  40. }
  41. @Override
  42. public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  43. // TODO Auto-generated method stub
  44. }
  45. // 在文字改变后调用
  46. @Override
  47. public void afterTextChanged(Editable s) {
  48. if (s.length() == 0) {
  49. hideBtn();// 隐藏按钮
  50. } else {
  51. showBtn();// 显示按钮
  52. }
  53. }
  54. };
  55. @Override
  56. public void hideBtn() {
  57. // 设置按钮不可见
  58. if (ib.isShown()) ib.setVisibility(View.GONE);
  59. }
  60. @Override
  61. public void showBtn() {
  62. // 设置按钮可见
  63. if (!ib.isShown()) ib.setVisibility(View.VISIBLE);
  64. }
  65. }
  66. interface EdtInterface {
  67. public void hideBtn();
  68. public void showBtn();
  69. }

另外,实现ImageButton(即那个叉)的点击事件,删除输入框中的内容,并隐藏按钮。

在TextWatch接口的afterTextChanged方法中对文字进行判断,若长度为0,就隐藏按钮,否则,显示按钮。

后面两步的实现就是加入到实际布局中,就不再写出来了,和上例的步骤一样的。最后显示效果如图:

  学会灵活的使用组合控件,对UI开发会有很大帮助。有什么问题可以留言交流~

时间: 2024-12-11 22:48:30

【转】android UI进阶之自定义组合控件的相关文章

Android开发学习笔记-自定义组合控件的过程

自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需求,定义一些API方法: ----------------------------------4.根据需要,自定义控件的属性,可以参照TextView属性: 5.自定义命名空间,例如: xmlns:itheima="http://schemas.android.com/apk/res/<包名&

Android开发学习笔记-自定义组合控件

为了能让代码能够更多的复用,故使用组合控件.下面是我正在写的项目中用到的方法. 1.先写要组合的一些需要的控件,将其封装到一个布局xml布局文件中. <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="

Android实例-手机安全卫士(七)-自定义组合控件

一.目标. 将多个系统控件(TextView.Button.CheckBox等)组合成一个自定义的控件,并像系统控件一样使用.如图所示第1个自动更新控件是根据相对布局放置而成的,第2个自动更新控件即为自定义组合控件,它可以想一般的TextView等系统控件一样重复使用. 自定义控件如图: 二.代码实现. 1.在layout文件夹下新建一个xml文件(取名model_setting_item.xml),用于保存自定义控件的布局. 2.在新建的xml文件(model_setting_item.xml

Android 自定义组合控件小结

引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控件组成一个功能完整组合控件并将其封装为面向对象的类,而并非讨论如何继承自SDK提供的控件类(比如TextView),对其进行自定义扩展的问题. 进入正题前,我们先来看一组功能需求 假设在手机需求上,那么如上三个界面我们可以使用三个Activity,每个Activity一个布局文件,实现起来比较独立,但是假设在Android pad上要

Android自定义控件之自定义组合控件(三)

前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本. 使用自定义组合控件的好处? 我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的. 1.)第一种方式:直接在每个xml布局中写相同的标题栏布局代码 <?xm

Android自定义组合控件--底部多按钮切换

效果图: 现在市场上大多数软件都是类似于上面的结构,底部有几个按钮用于切换到不同的界面.基于OOP思想,我想把下面的一整块布局封装成一个类,也就是我们的自定义组合控件-底部多按钮切换布局,我把它叫做BottomLayout 看上面的布局,几个按钮横向排列,我们先看一下布局 最外面LinearLayout 方向 horizontal,然后5个weight相同的RelativeLayout,每个RelativeLayout里面有一个Button(用了显示选中状态)个ImageView(用来显示红点)

android 自定义组合控件

自定义控件是一些android程序员感觉很难攻破的难点,起码对我来说是这样的,但是我们可以在网上找一些好的博客关于自定义控件好好拿过来学习研究下,多练,多写点也能找到感觉,把一些原理弄懂,今天就讲下自定义组合控件,这个特别适合在标题栏或者设置界面,看下面图: 就非常适合使用组合控件了,现在写一个玩玩: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

Android自定义组合控件--图片加文字,类似视频播放软件的列表

分四步来写: 1,组合控件的xml; 2,自定义组合控件的属性; 3,自定义继承组合布局的class类,实现带两参数的构造器; 4,在xml中展示组合控件. 具体实现过程: 一.组合控件的xml 我接触的有两种方式,一种是普通的Activity的xml:一种是父节点为merge的xml.我项目中用的是第一种,但个人感觉第二种好,因为第一种多了相对或者绝对布局层. 我写的 custom_pictext.xml <?xml version="1.0" encoding="u

Android自定义控件——自定义组合控件

转载请注明出处http://blog.csdn.net/allen315410/article/details/39581055  前面几篇博文介绍了Android如何自定义控件,其实就是讲一下如何"从无到有"的自定义一个全新的控件,继承View或者继承ViewGroup,复写其相关方法,这种自定义控件的方式相对来说难度较大,而且并不是所有需要新控件的情况下,都要这样进行.有很多情况下,我们只要运用好Android给我提供好的控件,经过布局巧妙的结合在一起,就是一个新的控件,我称之为&