当我尝试创建Android UI Component的动态实例时,它会给我“java.lang.InstantiationException”。
示例代码:
Class components[] = {TextView.class, Button.class,...}
Component mControl = null;
...
...
mControl = (Component) components[nIndexOfControl].newInstance();
有人可以指导我,实现上述目标的最佳方式是什么,因为我想为每个小部件保存if..else?
答案 0 :(得分:2)
TextView
类没有默认构造函数。三个可用的构造函数是:
TextView(Context context)
TextView(Context context, AttributeSet attrs)
TextView(Context context, AttributeSet attrs, int defStyle)
Button
类同样如此:
public Button (Context context)
public Button (Context context, AttributeSet attrs)
public Button (Context context, AttributeSet attrs, int defStyle)
您需要传递至少Context
变量来实例化所有UI(View
)控件的后代。
下一步更改您的代码:
Context ctx = ...;
Class<?> components[] = {TextView.class, Button.class };
Constructor<?> ctor = components[nIndexOfControl].getConstructor(Context.class);
Object obj = ctor.newInstance(ctx);
答案 1 :(得分:0)
View objects没有默认构造函数。看一下Class.newInstance()的javadoc。如果找不到匹配的构造函数,它会抛出InstantiationException
。
答案 2 :(得分:0)
我在Google上搜索了“java class.newInstance”和:
a)我找到了java.lang.Class类的文档,它解释了引发此异常的确切环境:
InstantiationException - if this Class represents an abstract class, an
interface, an array class, a primitive type, or void; or if the class has
no nullary constructor; or if the instantiation fails for some other reason.
b)建议的搜索词是“带有参数的java class.newinstance”,它找到了几种处理“class has no Nullary constructor”的方法,包括StackOverflow的一些结果。
您的类列表中没有数组类,基本类型或“void”,并且“其他原因”不太可能(并且无论如何都会在异常消息中解释)。如果类是抽象的或接口,那么你根本无法以任何方式实例化它。