Как передать AttributeSet при создании представления программно в Android
Затем я создаю программно, как горизонтальный вид, как программно передать AttributeSet.
Мой конструктор выглядит так:
public HorizontalListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
Я должен попробовать это:
mHlvSimpleList= new HorizontalListView(mcontext,R.style.niceview);
Ошибка:
Конструктор HorizontalListView(Context, int) не определен
в style.xml
<style name="niceview">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
Как передать AttributeSet в параметре соответствия конструктора горизонтального просмотра?
4 ответа
Конструктор с Context
а также AttributeSet
используется, когда ваш вид надувается из xml. Вы не должны использовать его для создания объекта. Вы должны использовать конструктор с Context
как парам.
AttributeSet
Это интерфейс, и вы можете создать экземпляр затем и реализовать весь метод, как показано ниже:
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
У меня есть способ получить 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();
если значение счетчика больше 0, значит, вы получаете правильный AttributeSet.
мой 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" />
Я столкнулся с этим вопросом, работая с целью забыть реализовать SomeView(Context)
конструктор и был только тот, с SomeView(Context, AttributeSet)
имеется в наличии. Из исходного кода ViewGroup видно, что SomeView(context)
будет эквивалентно SomeView(context, null)
, хоть.
Вы можете создать атрибут, ссылающийся на пользовательский стиль. Тогда вы должны быть в состоянии создать его с помощью
mHlvSimpleList= new HorizontalListView(mcontext, R.attr.niceview);
Полный пример доступен здесь https://gist.github.com/romannurik/7026222