如何在属性集中获取对另一个视图的引用 - 类似于相对布局中的 layout_below = "id"?

How to get reference to another view in attribute sets - similar to layout_below = "id" in relative layout?

我正在构建自定义视图。我能够使用 format="reference" 成功获取资源。但是,我现在想将另一个视图的 id 作为属性传递,并且我希望遵循类似于相对布局的限制。

  1. 这必须是 id 或对视图的引用 - 不是 drawablecolor 或任何其他值。
  2. 具有所提供 ID 的布局必须存在于当前 XML 文件中。
  3. 我应该能够获得对该视图的引用,并且应该能够将该视图传递给其他方法。

例如在相对布局中,如果您输入 layout_below = "@id+/someid",如果 someid 不合适,则会显示警告或错误。

如何实现,请帮忙

更新

这就是我定义属性的方式

<attr name="myView" format="reference"/>
<attr name="dimen" format="dimension"/>

这就是我在布局中定义视图的方式xml

....
xmlns:custom="http://schemas.android.com/apk/res-auto"
.....
<myPackage.mycustomView android:id = "@+id/myId"
     custom:dimen = "10dp" ///-- this one works fine
     custom:myView = "@+id/id_of_another_view_in_xml" //-- I am not able to retrive this view
     ....
/>

This must be id or reference to a view - not drawable or color or any other value.

当您在 attrs.xml 文件中为 ID 指定自定义视图的属性时,您只需要 reference 类型。

the layout with the id that is supplied must exist inside the current XML file.

当您输入无效 ID 时,您在 Android Studio 中看到的红色警告是 lint 警告。如果ID确实存在,只是不在布局文件中,它仍然会编译。

如果您想为您的自定义视图实现相同的功能,您可能需要 add your own lint rule

I should be able to get a reference to that view and should be able to pass that view to other methods.

不完全确定你在问什么。扩充自定义视图并从 XML 属性中获取值后,您应该拥有 ID 引用,然后可以在自定义视图中使用它来执行 findViewById。如果这不能回答您的问题,请澄清。

编辑:代码示例,在您的自定义视图构造函数中:

mIdReference = a.getResourceId(R.styleable.MyCustomView_my_view, 0)
if (mIdReference != 0) {
    View subView = findViewById(mIdReference)
}

希望对您有所帮助!