如何将自定义属性的值从父视图“级联”到其子视图?
使用示例最容易解释:
<com.example.CustomLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:percent="35" >
<com.example.CustomView
android:id="@+id/customView1"
app:percent="how-to-get-app:percent-value-here???"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</com.example.CustomLayout>
此处CustomLayout
扩展LinearLayout
。我使用attrs.xml
元素在<declare-styleable>
中定义了自定义属性“百分比”。如您所见,我在CustomLayout
的XML中将百分比设置为35。
我现在想将相同的值传递给CustomView
(扩展View
),并将其包含在CustomLayout
中。我无法在XML中找到一种方法(尽管在代码中很容易做到这一点)。
我尝试了以下内容:
app:percent="@attr/percent"
app:percent="?attr/percent"
这两个(预期)都会在NumberFormatException
处TypedArray#getInt()
失败。
那么,关于如何使其发挥作用的任何想法?
答案 0 :(得分:1)
虽然这个想法有点晚,而且方法并不简单,但我认为它仍然值得分享。我们可以将自定义属性放入主题中,因此属性可以从使用主题的父视图传递到所有子视图(即视图组中存在属性)。
示例如下:
<integer name="percentage">35</integer>
<style name="CustomTheme" parent="suitable theme for your case">
<item name="percent">@integer/percentage</item>
</style>
<com.example.CustomLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:theme="@style/CustomTheme" >
<com.example.CustomView
android:id="@+id/customView1"
app:percent="?attr/percent" <!--Note: that's how it refers to the value,
however, re-assign the attribute value here is meaningless as attribute percent
should exist in all child views now. You can retrieve its value via
Theme.obtainStyledAttributes(R.style.CustomTheme, new int[] {R.attr.percent})
in every child view-->
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</com.example.CustomLayout>