web-dev-qa-db-de.com

So übergeben Sie AttributeSet, wenn Sie die Ansicht programmgesteuert in Android erstellen

Ich erstelle programmgesteuert wie horizontalview, wie AttributeSet programmgesteuert übergeben wird.

Mein Konstruktor sieht so aus:

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

Ich habe das probiert:

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

Error:

Der Konstruktor HorizontalListView (Context, int) ist nicht definiert

in style.xml

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

</style>

Wie übergeben Sie AttributeSet im Übereinstimmungsparameter "horizontalistview"?

30
Bixms

Der Konstruktor mit Context und AttributeSet wird verwendet, wenn Ihre Ansicht aus xml aufgepumpt wird. Sie sollten es nicht verwenden, um ein Objekt zu erstellen. Sie sollten Konstruktor mit Context als Parameter verwenden.

AttributeSet ist Schnittstelle und Sie können eine Instanz von then erstellen und alle Methoden implementieren, wie unten gezeigt:

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

Und benutze es

TextView textView = new TextView(this, attrs);

aber es ist nicht richtig so .

Sie sollten Methoden aus Ihrer Ansicht verwenden, um die Eigenschaften der Ansicht festzulegen.

Das Einstellen von LayoutParams ist beispielsweise auf zwei Arten möglich

Zuerst mit der Methode setLayoutParams()

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

Die Sekunde, als Sie Ihre Ansicht zu ViewGroup hinzugefügt haben.

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

Wenn Sie Ihre Ansicht beispielsweise zu RelativeLayout hinzufügen oder hinzufügen möchten, sollten Sie LayoutParams verwenden, das für diese ViewGroup relevant ist. Es ist RelativeLayout.LayoutParams

32

ich habe eine Möglichkeit, das AttributeSet aus einer XML-Datei zu erhalten.

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

wenn der Zählwert größer als 0 ist, erhalten Sie ein passendes AttributeSet.

mein xml/test.xml ist wie folgt:

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

Ich stieß auf diese Frage, während ich mit einer Ansicht arbeitete, die vergessen hatte, den Konstruktor SomeView(Context) zu implementieren, und hatte nur eine mit SomeView(Context, AttributeSet) zur Verfügung. Aus dem Quellcode von ViewGroup scheint es, dass SomeView(context) jedoch äquivalent zu SomeView(context, null) wäre.

0
Elte Hupkes