android自定义布局的属性获取问题

我的自定义布局类是继承ViewGroup的,然后在XML中给布局的子控件Button添加了一个自定义的属性index,用来区分按钮的位置。我想知道在onLayout方法里... 我的自定义布局类是继承ViewGroup的,然后在XML中给 布局的子控件Button添加了一个自定义的属性index,用来区分按钮的位置。

我想知道在onLayout方法里面,怎么获取子控件的这个自定义属性的值?
展开
 我来答
微博honey_11
2016-11-20 · TA获得超过191个赞
知道小有建树答主
回答量:304
采纳率:100%
帮助的人:326万
展开全部

下面图片是android学习手册中关于attr的实例图,点击源码可以查看例子源码,点击文档可以查看文档。360手机助手中可下载


一、 在res/values 文件下定义一个attrs.xml 文件.代码如下:

<?xmlversion="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView">
        <attr name="textColor"format="color" />
        <attr name="textSize"format="dimension" />
    </declare-styleable>
</resources>

2.2  MyView.java

我们在MyView.java 代码编写如下,其中下面的构造方法是重点,我们获取定义的属性R.sytleable.MyView_textColor, 获取方法中后面通常设定默认值(float textSize =a.getDimension(R.styleable.MyView_textSize, 36 ); ), 防止我们在xml 文件中没有定义.从而使用默认值!

MyView 就是定义在<declare-styleablename="MyView "></declare-styleable> 里的 名字,获取里面属性用 名字_ 属性 连接起来就可以.TypedArray 通常最后调用 .recycle() 方法,为了保持以后使用该属性一致性.

publicMyView(Context context,AttributeSet attrs)
{
    super(context,attrs);
    mPaint = new Paint();
 
    TypedArray a =context.obtainStyledAttributes(attrs,
            R.styleable.MyView);
 
    int textColor =a.getColor(R.styleable.MyView_textColor,
            0XFFFFFFFF);
    float textSize =a.getDimension(R.styleable.MyView_textSize, 36);
 
    mPaint.setTextSize(textSize);
    mPaint.setColor(textColor);
 
    a.recycle();
}

MyView.java  MyView控件全部代码如下:

 

packagecom.android.tutor;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Rect;
importandroid.graphics.Paint.Style;
importandroid.util.AttributeSet;
importandroid.view.View;
publicclass MyView extends View {
    private Paint mPaint;
    private Context mContext;
    private static final String mString ="Welcome to Mr Wei's blog";
 
    public MyView(Context context) {
        super(context);
        mPaint = new Paint();
    }
    public MyView(Context context,AttributeSetattrs)
    {
        super(context,attrs);
        mPaint = new Paint();
 
        TypedArray a =context.obtainStyledAttributes(attrs,
                R.styleable.MyView);
 
        int textColor =a.getColor(R.styleable.MyView_textColor,
                0XFFFFFFFF);
        float textSize =a.getDimension(R.styleable.MyView_textSize, 36);
 
        mPaint.setTextSize(textSize);
        mPaint.setColor(textColor);
 
        a.recycle();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub 
        super.onDraw(canvas);
        //设置填充 
        mPaint.setStyle(Style.FILL);
 
        //画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标 
        canvas.drawRect(new Rect(10, 10, 100,100), mPaint);
 
        mPaint.setColor(Color.BLUE);
        //绘制文字 
        canvas.drawText(mString, 10, 110,mPaint);
    }
}

2.3 MyView 加入布局main.xml 

 将我们自定义的MyView 加入布局main.xml 文件中,并且使用自定义属性,自定义属性必须加上:

    " xmlns:test ="http://schemas.android.com/apk/res/com.android.tutor" ,test是自定义属性的前缀,          com.android.tutor 是我们包名.

main.xml 全部代码如下:

<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:test="http://schemas.android.com/apk/res/com.android.tutor"
    android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
    >
    <TextView
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
        android:text="@string/hello"
        />
    <com.android.tutor.MyView
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
        test:textSize="20px"
        test:textColor="#fff"
        />
</LinearLayout>
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式