`

Android自定义组合控件【转】

 
阅读更多

http://dev.10086.cn/cmdn/wiki/index.php?doc-view-5787.html


目标:实现textview和ImageButton组合,可以通过Xml设置自定义控件的属性。

  1.控件布局:以Linearlayout为根布局,一个TextView,一个ImageButton。

  Xml代码 收藏代码

   < ?xml version="1.0" encoding="utf-8"?>

   < LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"

   android:layout_width="fill_parent" android:layout_height="fill_parent"

   android:gravity="center_vertical">

   < TextView android:layout_height="wrap_content" android:id="@+id/text1"

   android:layout_width="wrap_content">< /TextView>

   < ImageButton android:layout_width="wrap_content"

   android:layout_height="wrap_content" android:id="@+id/btn1">< /ImageButton>

   < /LinearLayout>

  < ?xml version="1.0" encoding="utf-8"?>

  < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:layout_width="fill_parent" android:layout_height="fill_parent"

  android:gravity="center_vertical">

  < TextView android:layout_height="wrap_content" android:id="@+id/text1"

  android:layout_width="wrap_content">< /TextView>

  < ImageButton android:layout_width="wrap_content"

  android:layout_height="wrap_content" android:id="@+id/btn1">< /ImageButton>

  < /LinearLayout>

  2.自定义控件代码,从LinearLayout继承:

  Java代码 收藏代码

   public class ImageBtnWithText extends LinearLayout {

  }

   public ImageBtnWithText(Context context) {

   this(context, null);

   }

  

   public ImageBtnWithText(Context context, AttributeSet attrs) {

   super(context, attrs);

   LayoutInflater.from(context).inflate(R.layout.imagebtn_with_text, this, true);

     }

   }

  public class ImageBtnWithText extends LinearLayout {

  public ImageBtnWithText(Context context) {

  this(context, null);

  }

  public ImageBtnWithText(Context context, AttributeSet attrs) {

  super(context, attrs);

  LayoutInflater.from(context).inflate(R.layout.imagebtn_with_text, this, true);

  }

  }

  在构造函数中将Xml中定义的布局解析出来。

  3.在主界面布局xml中使用自定义控件:

  Xml代码 收藏代码

   < com.demo.widget2.ImageBtnWithText

   android:id="@+id/widget"

   android:layout_width="fill_parent"

   android:layout_height="fill_parent" />

  < com.demo.widget2.ImageBtnWithText

  android:id="@+id/widget"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent" />

  即使用完整的自定义控件类路径:com.demo.widget2.ImageBtnWithText定义一个元素。

  运行可以看到控件已经能够被加载到界面上。

  4.给按钮设置图片和文本

  如果图片是固定不变的,那么直接在控件布局中设置ImageButton的src属性即可。

  4.1通过Java代码设置,在控件代码中提供函数接口:

  Java代码 收藏代码

   public void setButtonImageResource(int resId) {

   mBtn.setImageResource(resId);

   }

  

   public void setTextViewText(String text) {

   mTv.setText(text);

   }

  public void setButtonImageResource(int resId) {

  mBtn.setImageResource(resId);

  }

  public void setTextViewText(String text) {

  mTv.setText(text);

  }

  然后再在主界面的onCreate()通过函数调用设置即可。

  4.2通过Xml设置属性

  4.2.1首先定义Xml可以设置的属性集合,在values下创建attrs.xml,文件名可随意,一般都叫attrs.xml

  Xml代码 收藏代码

   < ?xml version="1.0" encoding="utf-8"?>

  < resources>

   < declare-styleable name="ImageBtnWithText">

   < attr name="android:text"/>

   < attr name="android:src"/>

   < /declare-styleable>

   < /resources

  < ?xml version="1.0" encoding="utf-8"?>

  < resources>

  < declare-styleable name="ImageBtnWithText">

  < attr name="android:text"/>

  < attr name="android:src"/>

  < /declare-styleable>

  < /resources

  属性集合名字:ImageBtnWithText,自己可根据实际来定义;

  集合中包含的属性列表,每行一个属性。

  4.2.2修改自定义控件实现代码,以获取xml中定义的属性

  Java代码 收藏代码

   TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageBtnWithText);

   CharSequence text = a.getText(R.styleable.ImageBtnWithText_android_text);

   if(text != null) mTv.setText(text);

   Drawable drawable = a.getDrawable(R.styleable.ImageBtnWithText_android_src);

   if(drawable != null) mBtn.setImageDrawable(drawable);

   a.recycle()

  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageBtnWithText);

  CharSequence text = a.getText(R.styleable.ImageBtnWithText_android_text);

  if(text != null) mTv.setText(text);

  Drawable drawable = a.getDrawable(R.styleable.ImageBtnWithText_android_src);

  if(drawable != null) mBtn.setImageDrawable(drawable);

  a.recycle()

  首先通过context.obtainStyledAttributes获得所有属性数组;

  然后通过TypedArray类的getXXXX()系列接口获得相应的值。

  4.2.3在主界面布局中设置自定义控件的属

  android:text="ABC" android:src="@drawable/icon

  4.3自定义名称属性:

  在4.2中使用的属性名是Android系统命名空间的,都以android开头,比如android:text等。

实际开发中会自定义一些属性名,这些属性名仍然定义在4.2.1提到的attrs.xml中:

  4.3.1定义属性名

  Xml代码 收藏代码

   < attr name="appendText" format="string"/>

  < attr name="appendText" format="string"/>

  和直接使用系统的attr不同的是要增加一个format属性,说明此属性是什么格式的。format可选项可参见注1

  4.3.2使用自定义属性

  Xml代码 收藏代码

   < ?xml version="1.0" encoding="utf-8"?>

   < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"

   android:orientation="vertical" android:layout_width="fill_parent"

   android:layout_height="fill_parent">

   < com.demo.widget2.ImageBtnWithText

   android:text="ABC" android:src="@drawable/icon" android:id="@+id/widget"

   android:layout_width="fill_parent" android:layout_gravity="center"

   android:layout_height="fill_parent" myspace:appendText="123456">

   < /com.demo.widget2.ImageBtnWithText>

   < /LinearLayout>

  < ?xml version="1.0" encoding="utf-8"?>

  < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"

  android:orientation="vertical" android:layout_width="fill_parent"

  android:layout_height="fill_parent">

  < com.demo.widget2.ImageBtnWithText

  android:text="ABC" android:src="@drawable/icon" android:id="@+id/widget"

  android:layout_width="fill_parent" android:layout_gravity="center"

  android:layout_height="fill_parent" myspace:appendText="123456">

  < /com.demo.widget2.ImageBtnWithText>

  < /LinearLayout>

  直接在主布局文件中使用此属性appendText="abc"是不会设置生效的,而是要在主布局xml中定义一个xml命名空间:

xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"

  命名空间的名字可以自己随便定义,此处为myspace,即xmlns:myspace;

  后面的地址则有限制,其开始必须为:"http://schemas.android.com/apk/res/",后面则是包名com.demo.customwidget,

  此处的包名与AndroidManifest.xml中< manifest>节点的属性package="com.demo.customwidget"一致,不是自定义控件Java代码所在的包,当然简单的程序自定义控件Java代码也一般在此包内。

  注1:

  注1:format可选项

  "reference" //引用

  "color" //颜色

  "boolean" //布尔值

  "dimension" //尺寸值

  "float" //浮点值

  "integer" //整型值

  "string" //字符串

  "fraction" //百分数,比如200%

  枚举值,格式如下:

  < attr name="orientation">

  < enum name="horizontal" value="0" />

  < enum name="vertical" value="1" />

  < /attr>

  xml中使用时:

  android:orientation = "vertical"

  标志位,位或运算,格式如下:

  < attr name="windowSoftInputMode">

  < flag name = "stateUnspecified" value = "0" />

  < flag name = "stateUnchanged" value = "1" />

  < flag name = "stateHidden" value = "2" />

  < flag name = "stateAlwaysHidden" value = "3" />

  < flag name = "stateVisible" value = "4" />

  < flag name = "stateAlwaysVisible" value = "5" />

  < flag name = "adjustUnspecified" value = "0x00" />

  < flag name = "adjustResize" value = "0x10" />

  < flag name = "adjustPan" value = "0x20" />

  < flag name = "adjustNothing" value = "0x30" />

  < /attr>

  xml中使用时:

  android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">

  另外属性定义时可以指定多种类型值,比如:

  < attr name = "background" format = "reference|color" />

  xml中使用时:

  android:background = "@drawable/图片ID|#00FF00"

分享到:
评论

相关推荐

    Android自定义组合控件

    本文将深入探讨如何根据【标题】"Android自定义组合控件"和【描述】中的内容,结合【标签】"android 自定义控件 组合控件 自定义属性",来创建一个自己的自定义组合控件。 首先,我们要明白什么是自定义控件。在...

    手机安全卫士--Android自定义组合控件实现设置功能

    手机安全卫士--Android自定义组合控件实现设置功能,界面采用Android自定义组合控件的方式实现,更多详细信息请访问 http://blog.csdn.net/qq_20889581?viewmode=contents 文明的小流氓的博客

    android 自定义View — 自定义组合控件

    本文将深入探讨如何在Android中实现自定义组合控件,以提高应用的用户体验和界面设计的灵活性。 首先,理解自定义View的基本概念至关重要。自定义View是通过继承已有的View或 ViewGroup 类,然后重写其方法来实现的...

    Android 自定义组合控件案例

    以下将详细介绍Android自定义组合控件的相关知识点。 一、自定义控件的分类 1. 组件扩展:对现有控件进行功能增强或样式修改,例如自定义Button增加动画效果。 2. 组合控件:结合多个基础控件,形成新的复合控件,...

    android自定义组合控件

    在Android开发中,自定义组合控件是一种常见的需求,它允许开发者根据具体应用的界面设计和功能需求,创建独特且个性化的用户界面组件。本文将深入探讨如何在Android中实现自定义组合控件,以及这一过程中的关键知识...

    Android 自定义控件 组合控件

    总结起来,Android自定义组合控件的实现涉及到了对Android UI框架的深入理解和实践,包括继承自定义View或ViewGroup、测量与布局、绘制、事件处理等关键步骤。通过这样的方式,开发者可以构建出功能强大、交互丰富的...

    android 自定义组合控件

    总的来说,Android自定义组合控件是提高应用个性化和效率的重要手段。通过理解并掌握自定义控件的原理和技巧,开发者能够创造出更加独特和高效的用户界面。在这个过程中,不断实践、学习和分享,将使你在Android开发...

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

    自定义组合控件是Android开发中的一个重要技巧,它可以帮助开发者更高效地管理布局,减少重复代码,提高代码的可读性和可维护性。通过封装常见的UI元素,自定义组合控件可以作为基础组件在整个项目中复用,降低了...

    自定义组合控件实现

    在IT行业中,自定义组合控件的实现是Android开发中一个重要的知识点,它涉及到UI设计、自定义View以及布局管理等多个领域。自定义控件可以让开发者根据特定需求创建出具有独特功能和外观的用户界面元素,提升应用的...

    Android自定义view组合控件、重写控件的例子源码.rar

    本文将深入探讨如何在Android中创建自定义组合控件以及重写现有控件,并通过具体例子源码来帮助初学者理解这一过程。 首先,让我们了解什么是自定义View。在Android中,我们通常使用的诸如Button、TextView等都是...

    Android自定义控件之组合控件学习笔记分享

    我们来讲一下自定义组合控件,相信大家也接触过自定义组合控件吧,话不多说,直接干(哈~哈~): 大家看到这个觉得这不是很简单的吗,这不就是写个布局文件就搞定嘛,没错,确实直接上布局就行,不过,我只是用这个...

    【Android进阶】(1)用继承和组合方式自定义控件

    在Android开发中,自定义控件是提升应用用户体验和界面设计独特性的重要手段。本教程主要探讨如何通过继承和组合的方式来自定义控件,适用于已经有一定Android基础的开发者进行进阶学习。 首先,我们来理解自定义...

    Android使用系统控件组合成新的自定义控件

    在Android开发中,自定义控件是提升应用用户体验和界面设计独特性的重要手段。通过将系统提供的基础控件进行组合和扩展,我们可以创造出满足特定需求的复杂组件。本教程将深入探讨如何在Android Studio中利用现有...

    自定义组合控件

    在Android开发中,自定义组合控件是一种常见的需求,它能够帮助我们实现独特且复杂的界面设计,提升用户体验。本文将深入探讨自定义组合控件的概念、实现方式以及它如何体现XML布局思想,同时通过分析提供的文件`...

    android之自定义组合控件

    在Android开发中,自定义组合控件是一种常见的技术实践,它可以帮助我们实现更灵活、更具个性化的用户界面。自定义组合控件的本质是通过继承已有的Android基础组件或ViewGroup,然后结合自己的业务需求,扩展出具有...

    Android实现自定义组合控件

    总结来说,实现Android自定义组合控件涉及以下几个步骤: 1. 在`attrs.xml`中定义自定义属性。 2. 创建布局文件,使用自定义属性。 3. 编写Java代码,处理自定义控件的行为,解析并应用属性值。 通过以上步骤,你将...

    Android 自定义控件 组合控件 TitleBar

    总结来说,创建Android自定义组合控件TitleBar涉及以下几个关键步骤: 1. 选择合适的基础类,如LinearLayout。 2. 重写`onMeasure()`, `onLayout()`, 和 `onDraw()` 方法,实现布局和绘制。 3. 添加子视图并设置相应...

Global site tag (gtag.js) - Google Analytics