web-dev-qa-db-fra.com

Comment passer AttributeSet lors de la création d'une vue par programme dans Android

Je crée par programme comme horizontalview puis, comment passer AttributeSet dans par programme.

Mon constructeur ressemble à ceci:

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

J'ai essayé ceci:

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

Erreur:

Le constructeur HorizontalListView (Context, int) n'est pas défini

dans style.xml

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

</style>

Comment passer AttributeSet dans le paramètre de correspondance du constructeur horizontalistview?

30
Bixms

Le constructeur avec Context et AttributeSet est utilisé lorsque votre vue est gonflée à partir de xml. Vous ne devriez pas l'utiliser pour créer un objet. Vous devez utiliser le constructeur avec Context comme paramètre.

AttributeSet est une interface et vous pouvez créer une instance de then et implémenter toutes les méthodes comme indiqué ci-dessous:

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;
        }
    }; 

Et l'utiliser

TextView textView = new TextView(this, attrs);

mais ce n'est pas la bonne façon .

Vous devez utiliser les méthodes de votre vue pour définir les propriétés de la vue.

Par exemple, définir LayoutParams est une façon de procéder.

D'abord par la méthode setLayoutParams()

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

La seconde lorsque vous avez ajouté votre vue à ViewGroup;

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

Lorsque vous avez ou souhaitez ajouter votre vue, par exemple à RelativeLayout, vous devez utiliser LayoutParams correspondant à ce groupe de vues. C'est RelativeLayout.LayoutParams

32
Konrad Krakowiak

j'ai un moyen d'obtenir le AttributeSet à partir d'un fichier 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();

si la valeur de comptage est supérieure à 0, cela signifie que vous obtenez le bon AttributeSet.

mon xml/test.xml est comme ceci:

<?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" />
15
DaSqy Stc

J'ai rencontré cette question alors que je travaillais avec une vue qui avait oublié d'implémenter le constructeur SomeView(Context) et ne disposait que de celle avec SomeView(Context, AttributeSet). Dans le code source de ViewGroup , il apparaît cependant que SomeView(context) serait équivalent à SomeView(context, null).

0
Elte Hupkes