我正在尝试创建一个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 允许您使用将“ParentType”实例上的“someProperty”设置为标记之间的任何内容的语法来指定复杂的属性。在上面的示例中,这意味着将 LinkInfo 对象数组设置为 LinkInfo 的“属性”(或属性或其他)。
同样,我很确定上述方式在 Android 中是不可能的。但我希望在 Android 中找到某种方法,它可以让我使用声明性语法来设置这样的值,即使上面是错误的。