如何在 android 中以编程方式创建视图时传递 AttributeSet
How to pass AttributeSet when creating view programmatically in android
然后我像 horizontalview 一样以编程方式创建,如何以编程方式传递 AttributeSet。
我的构造函数如下所示:
public HorizontalListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
我试过这个:
mHlvSimpleList= new HorizontalListView(mcontext,R.style.niceview);
错误:
The constructor HorizontalListView(Context, int) is undefined
在style.xml
<style name="niceview">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
如何在horizontalistview构造器匹配参数中传递AttributeSet?
当您的视图从 xml 膨胀时,使用带有 Context
和 AttributeSet
的构造函数。你不应该用它来创建对象。您应该使用带有 Context
作为参数的构造函数。
AttributeSet
是接口,您可以创建 then 的实例并实现所有方法,如下所示:
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
时,您应该使用与此 ViewGroup 相关的 LayoutParams
。是RelativeLayout.LayoutParams
我有办法从 xml 文件中获取 AttributeSet。
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" />
您可以创建引用自定义样式的属性。然后你应该能够使用
实例化它
mHlvSimpleList= new HorizontalListView(mcontext, R.attr.niceview);
那里有一个完整的例子
https://gist.github.com/romannurik/7026222
我 运行 在处理一个忘记实现 SomeView(Context)
构造函数并且只有 SomeView(Context, AttributeSet)
可用的构造函数的视图时遇到了这个问题。不过,从 source code of ViewGroup 看来 SomeView(context)
等同于 SomeView(context, null)
。
然后我像 horizontalview 一样以编程方式创建,如何以编程方式传递 AttributeSet。
我的构造函数如下所示:
public HorizontalListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
我试过这个:
mHlvSimpleList= new HorizontalListView(mcontext,R.style.niceview);
错误:
The constructor HorizontalListView(Context, int) is undefined
在style.xml
<style name="niceview">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
如何在horizontalistview构造器匹配参数中传递AttributeSet?
当您的视图从 xml 膨胀时,使用带有 Context
和 AttributeSet
的构造函数。你不应该用它来创建对象。您应该使用带有 Context
作为参数的构造函数。
AttributeSet
是接口,您可以创建 then 的实例并实现所有方法,如下所示:
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
时,您应该使用与此 ViewGroup 相关的 LayoutParams
。是RelativeLayout.LayoutParams
我有办法从 xml 文件中获取 AttributeSet。
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" />
您可以创建引用自定义样式的属性。然后你应该能够使用
实例化它mHlvSimpleList= new HorizontalListView(mcontext, R.attr.niceview);
那里有一个完整的例子 https://gist.github.com/romannurik/7026222
我 运行 在处理一个忘记实现 SomeView(Context)
构造函数并且只有 SomeView(Context, AttributeSet)
可用的构造函数的视图时遇到了这个问题。不过,从 source code of ViewGroup 看来 SomeView(context)
等同于 SomeView(context, null)
。