android 自定义控件中获取属性的三种方式(转)

第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值。

(1)在xml文件中设置属性值

<com.example.activity.IconTextView
       android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/smile1"
    iconSrc="@drawable/smile"/>  

(2)在构造函数中拿到这个值

public IconTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        resourceID = attrs.getAttributeResourceValue(null, "iconSrc", 0);
        if(resourceID > 0) {
            bitmap = BitmapFactory.decodeResource(getResources(), resourceID);
        }
    }  

第二种方法,使用自己的命名空间

(1)注意在xml文件中,需要声明一个命名空间,形式为http:// + 这个VIEW的包名

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:mobile="http://com.example.activity"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >  

    <com.example.activity.IconTextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/smile1"
        mobile:iconSrc="@drawable/smile"/>  

</LinearLayout>  

(2)通过attrs.getAttributeResourceValue,其中第一个参数为命名空间。

  1. //命名空间

private final String namespace = "http://com.example.activity"

 public IconTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        resourceID = attrs.getAttributeResourceValue(namespace, "iconSrc", 0);
//      TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.IconTextView);
//      resourceID = array.getResourceId(R.styleable.IconTextView_iconSrc, 0);
        if(resourceID > 0) {
            bitmap = BitmapFactory.decodeResource(getResources(), resourceID);
        }
    }  

第三种方法,通过自定义attrs.xml来实现

(1)自定义一个attrs.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="IconTextView">
        <attr name="iconSrc" format="reference"/>
    </declare-styleable>
</resources>  

(2)在xml文件中使用这一属性,注意此时命名空间的书写规范。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:mobile="http://schemas.android.com/apk/res/com.example.activity"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >  

    <com.example.activity.IconTextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/smile1"
        mobile:iconSrc="@drawable/smile"/>  

    <com.example.activity.IconTextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/smile2"
        android:textSize="24dp"
        mobile:iconSrc="@drawable/smile"/>  

    <com.example.activity.IconTextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/smile3"
        android:textSize="36dp"
        mobile:iconSrc="@drawable/smile"/>  

</LinearLayout>  

(3)在代码中使用context.obtainStyledAttributes获得属性值

package com.example.activity;  

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;  

public class IconTextView extends TextView {
    //命名空间
    private final String namespace = "http://com.example.activity";
    //资源ID
    private int resourceID = 0;
    private Bitmap bitmap;  

    public IconTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.IconTextView);
        resourceID = array.getResourceId(R.styleable.IconTextView_iconSrc, 0);
        if(resourceID > 0) {
            bitmap = BitmapFactory.decodeResource(getResources(), resourceID);
        }
    }  

    @Override
    public void onDraw(Canvas canvas) {
        if (bitmap != null) {
            Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());  

            Rect target = new Rect();
            int textHeight = (int)getTextSize();
            target.left = 0;
            target.top =(int)(getMeasuredHeight() - getTextSize()) / 2 + 1;
            target.bottom = target.top + textHeight;
            target.right = (int)(textHeight * (bitmap.getWidth() / (float)bitmap.getHeight()));  

            canvas.drawBitmap(bitmap, src, target, getPaint());  

            canvas.translate(target.right + 2, 0);
        }  

        super.onDraw(canvas);
    }  

}  
时间: 2024-07-29 22:37:22

android 自定义控件中获取属性的三种方式(转)的相关文章

5.struts2中Action类中获取ServletAPI的三种方式

**Servlet的API的访问(开发中偶尔会使用到)** 1.在Action类中也可以获取到Servlet一些常用的API,有如下三种方式获取 * 完全解耦合的方式 * 使用接口注入的方式 * 使用ServletActionContext中静态方法直接访问Servlet的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的页面上. * 提供JSP注册的页面,演示下面这三种方式: <h3>注册页面</

【Struts2】Struts2获取session的三种方式

1.Map<String,Object> map =  ActionContext.getContext().getSession(); 2.HttpSession session = ServletActionContext.getRequest().getSession(); 3.让Action实现SessionAware接口,并实现public void setSession(Map<String, Object> session) {} 方法,Struts2会在实例化Act

Struts中的数据处理的三种方式

Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() throws Exception { // 1. 请求数据封装: 2. 调用Service处理业务逻辑,拿到结果数据 3. 数据保存到域中 /* * // Struts中对数据操作,方式1: 直接拿到ServletApi, 执行操作 HttpServletRequest request = Serv

java中获取路径的几种方式

总是忘记, 备份一下,方便下次用. 第一种: File directory = new File("");//参数为空 String courseFile = directory.getCanonicalPath() ;System.out.println(courseFile); 结果:C:\Documents and Settings\Administrator\workspace\projectName获取当前类的所在工程路径; 第二种: File f = new File(th

javascript中定义事件的三种方式

在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 3.在javascipt中,使用addEvenListener()方法 三种方法的比较 (1)在第二.三种方法中,可以向函数传入一个event对象,并读取其相应属性,而方法一不可以. (2)首选第二.三种,第一种不利于将内容与事件分离,也不能使用event对象的相关内容. 一些语法细节 (1)在第一种方法中,onclick大小写

JS中事件绑定的三种方式

以下是搜集的在JS中事件绑定的三种方式. 1. HTML onclick attribute <button type="button" id="upload" onclick="upload_file();"> 原文: http://www.w3school.com.cn/jsref/jsref_events.asp 2. jQuery .on() $(node).on("change", function(e)

Android中关闭应用的三种方式

当应用不再使用的时候,通常需要关闭应用,我们可以使用三种方式关闭android应用: 第一种方式:首先获取当前进程的id,然后杀死该进程(推荐) android.os.Process.killProcess(android.os.Process.myPid()) 第二种方式:终止当前正在运行的Java虚拟机,导致该程序终止 System.exit(0) 第三种方式:强制关闭与该包有关联的一切执行 ActivityManager manager=(ActivityManager) getSyste

【SSM整合】spring配置文件中读取配置文件的三种方式

目录 依赖 jdbc.properties applicationContext.xml(spring配置文件) 依赖 <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <

【Eclipse使用方法】Eclipse中安装插件的三种方式

Eclipse也用了很久,但是都没有怎么去研究过怎么安装插件,今天正好在自己新买的本上试了一下.现在将心得写下,以供参考.目前安装Eclipse插件主要有以下三种方式: 在线安装: 以TestNG的安装为例来阐述其安装过程. 第一步:点击菜单栏中“Help”菜单,在下拉列中选择“Install New Software...”.此时会弹出“install”的安装框. 第二步:在弹出的“install”框,选择之前已经建立好的site,如果没有建立好,则可以点击“Add”按钮,弹出一个添加site