设置属性/属性时,是否可以在XML中指定对象?

时间:2017-07-29 13:56:22

标签: java android xaml android-layout android-attributes

我正在尝试创建一个MultiLinkTextView类,允许您指定多个可点击的链接'文本中的区域,当单击一个区域时,让它调用一个具有表示该链接的用户定义ID的函数。这里已经有几个关于如何在TextView中创建可点击链接和跨度以便覆盖部分的示例。

然而,这个问题 专门用于查看是否可以通过布局文件中的属性 定义所需信息,而不是实现链接部分。

我来自Microsoft的XAML格式,您可以轻松地以声明方式执行此类操作,因为a)它们具有真实属性(自动推断属性)和b)它们允许构造任何对象在他们的XAML中,不仅仅是视图(前提是它构建在一个有意义的地方。)

我试图看看我是否可以在Android中执行类似操作:从布局文件中声明性地在我的对象上设置复杂属性。

为了促进这种设计,我希望这是可能的。

首先我们定义一个LinkInfo类,它可以通过编程方式创建,也可以通过读取属性在布局文件中创建(如果设置了正确的attrs.xml文件等):

public class LinkInfo
{
    public LinkInfo(int linkId, int spanStart, int spanEnd)
    {
        this.linkId    = linkId;
        this.spanStart = spanStart
        this.spanEnd   = spanEnd
    }

    public LinkInfo(Context context, AttributeSet attrs)
    {
        TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.LinkInfo);

        linkId    = styledAttrs.getInteger(R.styleable.LinkInfo_linkId, -1);
        spanStart = styledAttrs.getInteger(R.styleable.LinkInfo_spanStart, -1);
        spanEnd   = styledAttrs.getInteger(R.styleable.LinkInfo_spanEnd, -1);

        styledAttrs.recycle();
    }

    public final int spanId;
    public final int spanStart;
    public final int spanEnd;
}

然后,假设MultiLinkTextView公开了一个"属性" (在引号中,因为Android似乎没有属性本身,只有getter,setter和外部属性),其中包含这些LinkInfo个对象的集合/数组/列表,下面是我们的方法喜欢在XML布局中定义它。

<com.example.widgets.MultiLinkTextView
    android:text="This is a test which highlights LinkA, LinkB and LinkC"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <MultiLinkTextView.LinkInfos>

        <com.example.widgets.MultiLinkTextView.LinkInfo
            app:linkId="10"
            app:spanStart="32"
            app:spanEnd="37" />

        <com.example.widgets.MultiLinkTextView.LinkInfo
            app:linkId="20"
            app:spanStart="39"
            app:spanEnd="44" />

        <com.example.widgets.MultiLinkTextView.LinkInfo
            app:linkId="30"
            app:spanStart="49"
            app:spanEnd="54" />

    </MultiLinkTextView.LinkInfos>

</com.example.widgets.MultiLinkTextView>

注意,XAML允许您使用设置“someProperty”的语法来指定复杂属性。关于'ParentType&#39;实例到标签之间的任何内容。在上面的示例中,这意味着将LinkInfo对象数组设置为LinkInfo的属性&#39; (或属性或其他)。

同样,我非常确定在Android中无法实现上述方式。但我希望在Android中找到一些方法,让我使用声明性语法来设置这样的值,即使上面的内容是错误的。

0 个答案:

没有答案