Подтвердить что ты не робот

Как передать AttributeSet при программном программировании в android

Я создаю программно, как горизонтальный, тогда, как программно передать AttributeSet.

Мой конструктор выглядит так:

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

Я попробовал это:

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

Ошибка:

Конструктор HorizontalListView (Context, int) имеет значение undefined

в style.xml

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

</style>

Как передать AttributeSet в параметре соответствия конструктора horizontalistview?

4b9b3361

Ответ 1

Конструктор с Context и AttributeSet используется, когда ваше представление завышено от xml. Вы не должны использовать его для создания объекта. Вы должны использовать конструктор с 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, вы должны использовать LayoutParams, относящийся к этой группе ViewGroup. Это RelativeLayout.LayoutParams

Ответ 2

У меня есть способ получить AttributeSet из xml файла.

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();

если значение count больше 0, значит, вы получаете правильный атрибутSet.

my 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" />

Ответ 3

Вы можете создать атрибут, ссылающийся на пользовательский стиль. Затем вы сможете создать экземпляр, используя

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

Здесь представлен полный пример. https://gist.github.com/romannurik/7026222