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