在Android中映射XML属性和代码方法

发布于 2024-11-15 17:13:06 字数 2152 浏览 0 评论 0原文

我正在尝试创建自定义 Android 复合视图,以下是代码:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:id="@+id/linearLayout1">
        <ImageView android:src="@drawable/icon" 
            android:id="@+id/action_imageView"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </ImageView>
        <TextView android:textAppearance="?android:attr/textAppearanceLarge"
            android:id="@+id/action_text" android:layout_height="fill_parent"
            android:layout_width="fill_parent" android:text="TextView">
        </TextView>
    </LinearLayout>
</merge>

ActionWidget.java (我正在处理的组件):

public class ActionWidget extends LinearLayout 
{
...
    public ActionWidget(Context context, AttributeSet attributeSet, 
        int defStyle)
    {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater)context.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.action, this);
        setClickable(true);
    }

    public void setLabel(String label)
    {
        TextView text = (TextView)findViewById(R.id.action_text);
        text.setText(label);
    }

    public String getLabel()
    {
        return this.label;
    }
...
}

attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ActionWidget">
        <attr name="label" format="string" />
        <attr name="image" format="integer" />
    </declare-styleable>
</resources>

用法:

<com.someapp.form.ActionWidget
    android:id="@+id/actionWidget1" android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    app:label="Text changed">
</com.someapp.form.ActionWidget>

当我启动应用程序时,文本仍然是“TextView”。 我应该怎么做才能让它从 xml 加载?

I'm trying to create a custom Android compound view, here is the code:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:id="@+id/linearLayout1">
        <ImageView android:src="@drawable/icon" 
            android:id="@+id/action_imageView"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </ImageView>
        <TextView android:textAppearance="?android:attr/textAppearanceLarge"
            android:id="@+id/action_text" android:layout_height="fill_parent"
            android:layout_width="fill_parent" android:text="TextView">
        </TextView>
    </LinearLayout>
</merge>

ActionWidget.java (the component I'm working on):

public class ActionWidget extends LinearLayout 
{
...
    public ActionWidget(Context context, AttributeSet attributeSet, 
        int defStyle)
    {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater)context.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.action, this);
        setClickable(true);
    }

    public void setLabel(String label)
    {
        TextView text = (TextView)findViewById(R.id.action_text);
        text.setText(label);
    }

    public String getLabel()
    {
        return this.label;
    }
...
}

attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ActionWidget">
        <attr name="label" format="string" />
        <attr name="image" format="integer" />
    </declare-styleable>
</resources>

Usage:

<com.someapp.form.ActionWidget
    android:id="@+id/actionWidget1" android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    app:label="Text changed">
</com.someapp.form.ActionWidget>

When I launch the application, the text is still "TextView".
What should I do to make it load from the xml?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凑诗 2024-11-22 17:13:06

重写你的构造函数如下:

public ActionWidget(Context context, AttributeSet attributeSet, int defStyle){
    super(context, attributeSet); 

    inflate(context, R.layout.action, this);

    TypedArray attributes = context.obtainStyledAttributes(attributeSet,
            R.styleable.ActionWidget);

    CharSequence attrValue = attributes
            .getString(R.styleable.ActionWidget_label);
    if (attrValue != null)
        setLabel(attrValue);

    attributes.recycle();
}

Rewrite your constructor as follows:

public ActionWidget(Context context, AttributeSet attributeSet, int defStyle){
    super(context, attributeSet); 

    inflate(context, R.layout.action, this);

    TypedArray attributes = context.obtainStyledAttributes(attributeSet,
            R.styleable.ActionWidget);

    CharSequence attrValue = attributes
            .getString(R.styleable.ActionWidget_label);
    if (attrValue != null)
        setLabel(attrValue);

    attributes.recycle();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文