我正在尝试创建一个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中找到一些方法,让我使用声明性语法来设置这样的值,即使上面的内容是错误的。