如何在android中以编程方式创建视图时传递AttributeSet

时间:2015-03-13 08:53:18

标签: android android-styles

我以编程方式创建类似于horizo​​ntalview,然后如何以编程方式传递AttributeSet。

我的构造函数如下所示:

public HorizontalListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

我试过这个:

mHlvSimpleList= new HorizontalListView(mcontext,R.style.niceview);

错误:

  

构造函数Horizo​​ntalListView(Context,int)未定义

在style.xml中

<style name="niceview">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>

</style>

如何在horizo​​ntalistview构造函数匹配参数中传递AttributeSet?

4 个答案:

答案 0 :(得分:33)

当您的视图从xml中膨胀时,将使用包含ContextAttributeSet的构造函数。你不应该用它来创造对象。您应该使用Context作为参数的构造函数。

AttributeSet是接口,您可以创建then的实例并实现所有方法,如下所示:

AttributeSet attrs = new AttributeSet(){
        @Override
        public int getAttributeCount() {
            return 0;
        }

        @Override
        public String getAttributeName(int index) {
            return null;
        }

        @Override
        public String getAttributeValue(int index) {
            return null;
        }

        @Override
        public String getAttributeValue(String namespace, String name) {
            return null;
        }

        @Override
        public String getPositionDescription() {
            return null;
        }

        @Override
        public int getAttributeNameResource(int index) {
            return 0;
        }

        @Override
        public int getAttributeListValue(String namespace, String attribute, String[] options, int defaultValue) {
            return 0;
        }

        @Override
        public boolean getAttributeBooleanValue(String namespace, String attribute, boolean defaultValue) {
            return false;
        }

        @Override
        public int getAttributeResourceValue(String namespace, String attribute, int defaultValue) {
            return 0;
        }

        @Override
        public int getAttributeIntValue(String namespace, String attribute, int defaultValue) {
            return 0;
        }

        @Override
        public int getAttributeUnsignedIntValue(String namespace, String attribute, int defaultValue) {
            return 0;
        }

        @Override
        public float getAttributeFloatValue(String namespace, String attribute, float defaultValue) {
            return 0;
        }

        @Override
        public int getAttributeListValue(int index, String[] options, int defaultValue) {
            return 0;
        }

        @Override
        public boolean getAttributeBooleanValue(int index, boolean defaultValue) {
            return false;
        }

        @Override
        public int getAttributeResourceValue(int index, int defaultValue) {
            return 0;
        }

        @Override
        public int getAttributeIntValue(int index, int defaultValue) {
            return 0;
        }

        @Override
        public int getAttributeUnsignedIntValue(int index, int defaultValue) {
            return 0;
        }

        @Override
        public float getAttributeFloatValue(int index, float defaultValue) {
            return 0;
        }

        @Override
        public String getIdAttribute() {
            return null;
        }

        @Override
        public String getClassAttribute() {
            return null;
        }

        @Override
        public int getIdAttributeResourceValue(int defaultValue) {
            return 0;
        }

        @Override
        public int getStyleAttribute() {
            return 0;
        }
    }; 

并使用它

TextView textView = new TextView(this, attrs);

这种方法不正确

您应该使用视图中的方法来设置视图属性。

例如设置LayoutParams是两种方法

首先按方法setLayoutParams()

view.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

将视图添加到ViewGroup时的第二个;

viewGroup.addView(yourView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

如果您有或者想要将视图添加到例如RelativeLayout,则应使用与此ViewGroup相关的LayoutParams。它是RelativeLayout.LayoutParams

答案 1 :(得分:16)

我有办法从xml文件中获取AttributeSet。

XmlPullParser parser = getResources().getXml(R.xml.test);
        try {
            parser.next();
            parser.nextTag();
        } catch (Exception e) {
            e.printStackTrace();
        }

        AttributeSet attr = Xml.asAttributeSet(parser);
        int count = attr.getAttributeCount();

如果计数值大于0,则表示您获得了正确的AttributeSet。

我的xml / test.xml是这样的:

<?xml version="1.0" encoding="utf-8"?>
<com.galoisli.myapplication.MyListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/listView"
    android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />

答案 2 :(得分:0)

我在处理一个视图时忘了实现SomeView(Context)构造函数,而只有一个带有SomeView(Context, AttributeSet)的视图可用。从source code of ViewGroup看来,SomeView(context)等同于SomeView(context, null)

答案 3 :(得分:-4)

您可以创建引用自定义样式的属性。然后你应该能够使用

实例化它
mHlvSimpleList= new HorizontalListView(mcontext, R.attr.niceview);

那里有一个完整的例子 https://gist.github.com/romannurik/7026222