求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   模型库  
会员   
 


DeepSeek大模型应用开发实践
6月12-13日 厦门



基于 UML 和EA进行分析设计
6月23-24日 北京+线上



人工智能、机器学习& TensorFlow+Keras
6月22-23日 北京
 
 
 

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自定义组件
1045 次浏览
42次  

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元





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



1045 次浏览
42次
 捐助