如何从xml布局父级获取样式属性

时间:2018-06-17 10:47:12

标签: android android-layout

我遇到了从xml布局的父元素获取自定义布局属性的巨大麻烦 好吧,假设我有这样的布局

<com.blackstephen.customlayoutexperimental.StripedLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/stripedLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:divider_width="5dp">

<!-- put first view to left. -->
<TextView
    android:background="@mipmap/o"
    android:paddingStart="6dp"
    android:paddingEnd="6dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_position="left"
    app:percentage="40"
    android:text="@string/l1"/>
<com.blackstephen.customlayoutexperimental.StripedLayout/>

请注意,我在子(TextView)应用程序中有这些样式属性:layout_position =&#34; left&#34;         应用程式:百分比=&#34; 40&#34; 我可以通过将此内部类放入自定义显示的代码中来获取这些值

 /**
 * Custom per-child layout information.
 */
public static class LayoutParams extends MarginLayoutParams {
    /**
     * The gravity to apply with the View to which these layout parameters
     * are associated.
     */
    public int gravity = Gravity.TOP | Gravity.START;
    public int position = 0;
    public int percentage = 33;

    public LayoutParams(Context c, AttributeSet attrs) {
        super(c, attrs);

        // Pull the layout param values from the layout XML during
        // inflation.  This is not needed if you don't care about
        // changing the layout behavior in XML.
        TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.StripedLayoutLP);
        gravity = a.getInt(R.styleable.StripedLayoutLP_android_layout_gravity, gravity);
        position = a.getInt(R.styleable.StripedLayoutLP_layout_position, position);
        percentage = a.getInt(R.styleable.StripedLayoutLP_percentage, percentage);
        a.recycle();
    }

但这只会给我每个孩子的风格属性 我还想要来自父级的样式属性app:divider_width =&#34; 5dp&#34;。 我该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以在drawable文件夹中创建XML文件,并将所需的所有属性放在该XML中。如果你想要一个分隔符在drawable中创建一个divider.xml并定义你想要的所有属性。然后用户android:divider"@drawable/divider"在TextView上调用这些属性。

实施例

<shape android:shape="rectangle"
xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/transparent" /> // color of the divider

在TextView中使用

    android:divider="@drawable/divider"
    android:dividerHeight="10dp"

答案 1 :(得分:0)

对于每个孩子,我都会使用 一个名为LayoutParams的内部类,它扩展了MarginLayoutParams
但是对于父级布局参数,我在构造函数中使用了这段代码

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.StripedLayout);
    dividerWidth = a.getDimensionPixelSize(R.styleable.StripedLayout_divider_width, dividerWidth);
    mDividerWidth = dividerWidth;
    a.recycle();