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"?
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
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" />
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.