求知 文章 文库 Lib 视频 Code iProcess 课程 认证 咨询 工具 火云堂 讲座吧   成长之路  
会员   
要资料
 
追随技术信仰

随时听讲座
每天看新闻
 
 

Android开发教程
Android 开发环境配置
Android 架构
Android 应用组件
Android Hello World示例
Android 资源组织和访问
Android Activity
Android Service
Android 广播接收器
Android 内容提供者
Android 碎片/片段
Android Intent过滤器
Android UI布局
Android UI控件
Android 事件处理
Android 样式和主题
Android 自定义组件
Android 拖放
Android 通知
Android 基于位置服务
Android 发送电子邮件
Android 发送短信/SMS
Android 拨打电话
发布Android应用
ndroid Alertdialog
Android Animation实例
Android音频捕获
Android音频管理器实例
Android
Android最佳实践
Android Bluetooth实例
Android Camera
Android Clipboard
Android自定义字体
Android数据备份
Android Gestures/手势
Android图片效果
Android图片切换
Android内部存储
Android JetPlayer实例
Android JSON解析器
Android加载Spinner
Android本地化
Android登录实例
Android MediaPlayer
 
 

Android自定义组件
58 次浏览
14次  
 捐助

Android提供了一个预建的部件,如Button, TextView, EditText, ListView, CheckBox, RadioButton, Gallery, Spinner, AutoCompleteTextView等可以直接使用在Android应用程序开发中,但有可能还有一种情况,当不满意现有可用的窗口小部件的功能。 Android 提供创建自定义组件功能,定制以满足需求

如果只需要进行小的调现有的小工具或布局,可以简单的子类的小工具或布局和覆盖它的方法,这将精确地控制屏幕元素的外观和功能。

本教程介绍了如何创建自定义视图,并利用它们在应用程序,如下步骤。

创建一个简单的自定义组件

最简单的创建自定义的组件方法是扩展现有的widget类或子类,如果想扩展现有部件,如Button, TextView, EditText, ListView, CheckBox等,否则可以从android.view.View类开始扩展。

在其最简单的形式,编写构造函数对应的所有基类的构造函数。例如,如果要扩展 TextView 创建DateView 以下三个构造,创建DateView类:

public class DateView extends TextView {
     public DateView(Context context) {
        super(context);
        //--- Additional custom code --
     }
     public DateView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //--- Additional custom code --
     }
     public DateView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        //--- Additional custom code --
     }
  }

TextView 的子类DateView已经创建,所以可以获得有关TextView 的所有属性、方法和事件,能够使用不需要任何进一步的实现。这里将实现额外的自定义功能在自己编写的代码,如下面的例子解释。

如果要求执行自定义绘图/定制部件的尺寸,那么需要重写 onMeasure(int widthMeasureSpec, int heightMeasureSpec) 和 onDraw(Canvas canvas) 方法。如果不打算调整或变更内置组件的形状,那么并不需要使用这些方法在自定义组件。

布局管理报告部件的宽度和高度需要协调 onMeasure() 方法,需要调用setMeasuredDimension(int width, int height),这种方法来报告尺寸大小。

可以执行自定义绘图里Canvas 的onDraw(Canvas canvas) 方法,其中android.graphis.Canvas其对应 Swing 是非常相似的,drawRect(), drawLine(), drawString(), drawBitmap() 等,可以用它来绘制组件。

完成了一个自定义组件的实现之后,通过扩大现有的部件,将能够实例化这些自定义组件在应用程序开发两种方式:

Activity类实例内使用代码

这是非常相似的方式实例化自定义组件实例的方式,在活动类的内置部件。例如,可以使用下面的代码实例上面定义的自定义组件:

@Override
protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
              DateView dateView = new DateView(this);
       setContentView(dateView);
}

查看这个例子来了解如何使用代码里面活动实例化一个基本的Android自定义组件。

使用布局XML文件实例

使用传统布局XML文件实例的内置部件,相同的概念适用于自定义部件,因此将能够实例化自定义组件布局XML文件,解释如下。在com.yiibai.dateviewdemo包,已经把所有的代码相关DateView 和 DateView 类,已经把自定义组件的完整的逻辑的Java类名。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="@dimen/activity_vertical_margin"
      android:paddingLeft="@dimen/activity_horizontal_margin"
      android:paddingRight="@dimen/activity_horizontal_margin"
      android:paddingTop="@dimen/activity_vertical_margin"
      tools:context=".MainActivity" >
      <com.yiibai.dateviewdemo.DateView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:textColor="#fff"
       android:textSize="40sp"
       android:background="#000"
       />
</RelativeLayout>

要注意,在这里我们使用的所有 TextView 属性以及自定义组件没有任何变化。类似的方式能够使用所有的事件、方法,以及DateView组件。

通过这个例子,了解如何使用布局XML文件实例化一个基本的Android自定义组件。

使用自定义属性的自定义组件

我们已经看到可以如何扩展功能的内置部件,但上面给出两个例子中看到,扩展组件,可以利用它的父类的所有默认属性。但考虑到一种情况,当想从头开始创建自己的属性。下面是一个简单的程序创建和使用Android的自定义组件的新属性。这里介绍三个属性,并使用它们,如下所示:

<com.yiibai.dateviewdemo.DateView
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:textColor="#fff"
     android:textSize="40sp"
     custom:delimiter="-"
     custom:fancyText="true"
  />

第1步

第一步,使用自定义的属性在 res/values/ 目录下创建新XML文件中定义attrs.xml。看看一个例子文件 attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
  <resources>
     <declare-styleable name="DateView">
     <attr name="delimiter" format="string"/>
     <attr name="fancyText" format="boolean"/>
     </declare-styleable>
  </resources>

这里 name=value 就是要使用的布局XML文件中并作为属性,format=type 属性的类型。

第2步

第二个步骤将是从布局XML文件中读取这些属性,并将其设置为组件。这个逻辑将获得通过属性集的构造函数,因为这是包含XML属性。要读取XML中的值,首先需要从AttributeSet创建一个TypedArray,然后用它来读取和设置值,如下面的示例代码所示:

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DateView);
  final int N = a.getIndexCount();
  for (int i = 0; i < N; ++i)
  {
     int attr = a.getIndex(i);
     switch (attr)
     {
        case R.styleable.DateView_delimiter:
           String delimiter = a.getString(attr);
           //...do something with delimiter...
           break;
        case R.styleable.DateView_fancyText:
           boolean fancyText = a.getBoolean(attr, false);
           //...do something with fancyText...
           break;
     }
  }
  a.recycle();

第3步

最后,可以使用布局XML文件中定义的属性如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      xmlns:custom="http://schemas.android.com/apk/res/com.yiibai.dateviewdemo"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="@dimen/activity_vertical_margin"
      android:paddingLeft="@dimen/activity_horizontal_margin"
      android:paddingRight="@dimen/activity_horizontal_margin"
      android:paddingTop="@dimen/activity_vertical_margin"
      tools:context=".MainActivity" >
      <com.yiibai.dateviewdemo.DateView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:textColor="#fff"
      android:textSize="40sp"
      custom:delimiter="-"
      custom:fancyText="true0"
      />
</RelativeLayout>

重要的部分是xmlns:custom="http://schemas.android.com/apk/res/com.yiibai.dateviewdemo"。需要注意的是http://schemas.android.com/apk/res/将保持原样,但最后一部分需要设置包名,也可以使用任何xmlns:在这个例子中,使用的是custom,但可以使用任何喜欢的名字。

看看这个例子,以了解如何创建自定义属性Android自定义组件 的简单步骤。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



58 次浏览
14次
 捐助
 

每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号