使用attrs.xml中的属性时布局中的错误

时间:2016-07-29 09:10:22

标签: android android-layout properties

我正在尝试使用attrs.xml中的两个属性,例如:contenthandle。当我在构建布局时使用它们时视图消失了。我已经尝试了3天的bug,但没有任何效果。 非常感谢帮助!

上下文代码

<hh.hhh.app.android.hhhh.widget.ExpandablePanel
    android:id="@+id/expandablePanel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:handle="@+id/expandButton"
    app:content="@+id/listViewProduct"
    app:collapsedHeight="50dip"
    app:animationDuration="25">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listViewProduct"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/expandButton"/>
</hh.hhh.app.android.hhhh.widget.ExpandablePanel>

attrs.xml代码

    <?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ExpandablePanel">
        <attr name="handle" format="reference" />
        <attr name="content" format="reference" />
        <attr name="collapsedHeight" format="dimension"/>
        <attr name="animationDuration" format="integer"/>
    </declare-styleable>
</resources>

1 个答案:

答案 0 :(得分:0)

我正在分享我自己的自定义类作为示例。因此,对于所有自定义函数,您需要首先检查它是否在EditMode中。 isInEditMode()告诉我们,IDE预览或电话正在呈现布局。 IDE预览功能不如运行我们的自定义代码那么强大,因此建议在预览时进行渲染时不要运行自定义。我附加我的自定义类,只是了解确切的情况。

    public class DynamicImageView extends ImageView {
    static DynamicImageTypeListener masterImageTypeListener;
    DynamicImageTypeListener imageTypeListener;
    int imageResourceArray;

    public DynamicImageView(Context context, AttributeSet attr, int defStyle) {
        super(context, attr, defStyle);
        initValues(attr, defStyle);
    }

    public DynamicImageView(Context context, AttributeSet attr) {
        super(context, attr);
        initValues(attr, 0);
    }

    public DynamicImageView(Context context) {
        super(context);
    }

    public static void setMasterImageTypeListener(DynamicImageTypeListener masterImageTypeListener) {
        DynamicImageView.masterImageTypeListener = masterImageTypeListener;
    }

    public void setImageTypeListener(DynamicImageTypeListener imageTypeListener) {
        this.imageTypeListener = imageTypeListener;
    }

    private void initValues(AttributeSet attr, int defStyle) {
        if (!isInEditMode()) {  //This code will run only on phone not by preview.
            TypedArray a = getContext().obtainStyledAttributes(attr, R.styleable.DynamicImageView, defStyle, 0);
            imageResourceArray = a.getResourceId(0, 0);
            updateImage();
            a.recycle();
        }
    }

    public void updateImage() {
        TypedArray imgs = getResources().obtainTypedArray(imageResourceArray);
        int imageIndex = imageTypeListener != null ? imageTypeListener.getImageType(getContext()) : (masterImageTypeListener != null ? masterImageTypeListener.getImageType(getContext()) : 0);
        setImageResource(imgs.getResourceId(imageIndex, -1));
    }
}

希望它会有所帮助:)