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

How to pass AttributeSet when creating view programmatically in android

然后我像 horizo​​ntalview 一样以编程方式创建,如何以编程方式传递 AttributeSet。

我的构造函数如下所示:

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

我试过这个:

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

错误:

The constructor HorizontalListView(Context, int) is undefined

在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?

当您的视图从 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

我有办法从 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" />

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

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

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

我 运行 在处理一个忘记实现 SomeView(Context) 构造函数并且只有 SomeView(Context, AttributeSet) 可用的构造函数的视图时遇到了这个问题。不过,从 source code of ViewGroup 看来 SomeView(context) 等同于 SomeView(context, null)