具有自定义属性的 Android 自定义 View

标签 android android-layout view custom-attributes

我已经制作了自定义 View ,我想为其设置一些自定义属性。我想将另一个 View 的 ID 作为属性传递。

自定义 View 属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="IdNumber">
        <attr name="firstName" format="integer"/>
        <attr name="lastName" format="integer"/>
        <attr name="address" format="integer"/>
        <attr name="birthDate" format="integer"/>
    </declare-styleable>
</resources>

我使用自定义 View 的布局:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/display_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:layout_centerHorizontal="true"
        android:tag="name"
        android:ems="10" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/id_number"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/display_name"/>

    <ge.altasoft.custom_views.IdNumber
        android:id="@+id/custom_id_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/id_number"
        android:paddingLeft="35dip"
        custom:firstName="@id/display_name"/>


</RelativeLayout>

自定义 View 类的构造函数,我想在其中获取属性值:

 public IdNumber (Context context, AttributeSet attrs) {
        super(context, attrs);
        initViews();

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IdNumber);
        final int N = a.getIndexCount();
        for(int i = 0; i < N; i++){
            int attr = a.getIndex(i);
            switch(attr){
                case R.styleable.IdNumber_firstName:
                    int firstNameViewID = a.getInteger(attr, -1);
                    break;
            }
        }
        a.recycle();
    }

问题是 int firstNameViewID = a.getInteger(attr, -1); 只是 0,而不是 View 的 ID。

custom:firstName="@id/display_name" <<< 这里应该是哪里出了问题,但不知道是哪里出了问题。当我为自定义属性分配一些整数值时,它起作用了,但它对 Id-s 不起作用。

感谢您的提前帮助。

最佳答案

改变你的定义<attr name="firstName" format="reference"/> 在您的代码中使用 int firstNameViewID = a.getResourceId(attr, -1);

希望对您有所帮助!

关于具有自定义属性的 Android 自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18505528/

相关文章:

java - Android:Viewpager 还是 Viewflipper?

Android 在循环中引用自定义 View ?

iOS : UI - Design login page and Tab view - Tab not coming after Login

java - 在开始新 Activity 之前等待 HttpRequest 完成

java - 如何在每次触摸屏幕时绘制一个新的圆圈?

java - 第二个 Activity 的 TextView 内的文本超出了屏幕,但适用于更大的显示屏手机

java - Android - 空对象引用错误

c++ - 使用 CString 参数调用 UpdateAllViews

java - 无法从 CursorWindow 读取第 0 行、第 -1 列。错误

android - 配置 IntelliJ IDEA,以便在 git 中检测到源但检测到未注册的 Vcs 根