无法显示创建的CustomView

时间:2015-06-13 05:56:26

标签: android android-custom-view


最近我一直在尝试创建一个CustomView 我正在按照教程进行操作,但是当我尝试运行代码时,我的自定义视图没有显示在我的Android屏幕上。
我的 attrs.xml 代码是: -

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TimeView">
        <attr name="text" format="string"/>
        <attr name="setColor" format="boolean"/>
    </declare-styleable>

</resources>

<小时/> 以下是我的CustomView的代码,即 TimeView.java : -

package com.example.custom;

import java.text.SimpleDateFormat;
import java.util.Calendar;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.TextView;

public class TimeView
extends TextView{
    public String titleText;
    public boolean color;
    public TimeView(Context context) {
        super(context);
        setTimeView();
        // TODO Auto-generated constructor stub
    }
    public TimeView(Context c,AttributeSet as)
    {
        super(c,as);
        TypedArray ty=c.obtainStyledAttributes(as,R.styleable.TimeView);
        int count=ty.getIndexCount();
        try{
            for(int i=0;i<count;i++)
            {
                int attr=ty.getIndex(i);
                if(attr==R.styleable.TimeView_text)
                {
                    titleText=ty.getString(attr);
                }
                else if(attr==R.styleable.TimeView_setColor)
                {
                    color=ty.getBoolean(attr, false);
                    decorate();
                }
            }
        }
        finally
        {
            ty.recycle();
        }
    }
    public TimeView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        setTimeView();

    }
    public void setTimeView()
    {
        SimpleDateFormat sdf=new SimpleDateFormat("hh.mm aa");
        String time=sdf.format(Calendar.getInstance().getTime());
        if(this.titleText!=null)
        {
            setText(this.titleText+" "+time);
        }
        else
            setText(time);
    }
    public void decorate()
    {
        if(this.color==true)
        {
            setShadowLayer(4, 2, 2, Color.rgb(250, 00, 250));
            setBackgroundColor(Color.CYAN);
        }
        else{
            setBackgroundColor(Color.RED);
        }
    }
}

<小时/> 最后这是我的 activity_main.xml

的代码
<LinearLayout 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.example.custom"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.custom.MainActivity" >

    <com.example.custom.TimeView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="40sp"
        custom:text="My View"
        custom:setColor="true"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</LinearLayout>

<小时/> 我得到了这个结果: -
Result
我不知道我在哪里做错了。
请帮帮我! 提前谢谢。

1 个答案:

答案 0 :(得分:1)

只需使用我的代码覆盖您的代码即可。你只是在检索属性时犯了错误。 请勿忘记在第一行添加您的包裹名称

import java.text.SimpleDateFormat;
import java.util.Calendar;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.TextView;

public class TimeView
        extends TextView {
    public String titleText;
    public boolean color;

    public TimeView(Context context) {
        super(context);
        setTimeView(context, null);
    }

    public TimeView(Context c, AttributeSet as) {
        super(c, as);
        setTimeView(c, as);
    }

    public TimeView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setTimeView(context, attrs);
    }

    public void setTimeView(Context c, AttributeSet attrs) {
        TypedArray a;
        if (attrs != null) {
            a = c.getTheme().obtainStyledAttributes(
                    attrs,
                    R.styleable.BLProgress,
                    0, 0);
        } else {
            throw new IllegalArgumentException("Must have to pass the attributes");
        }


        try {
            titleText = a.getString(R.styleable.TimeView_text);
            color = a.getBoolean(R.styleable.TimeView_setColor, false);
        } finally {
            a.recycle();
        }

        SimpleDateFormat sdf = new SimpleDateFormat("hh.mm aa");
        String time = sdf.format(Calendar.getInstance().getTime());
        if (this.titleText != null) {
            setText(this.titleText + " " + time);
        } else
            setText(time);

        decorate();

    }

    public void decorate() {
        if (color) {
            setShadowLayer(4, 2, 2, Color.rgb(250, 00, 250));
            setBackgroundColor(Color.CYAN);
        } else {
            setBackgroundColor(Color.RED);
        }
    }
}

这是屏幕截图..

enter image description here