Создание динамического класса Android дает исключение java.lang.InstantiationException - PullRequest
0 голосов
/ 28 июня 2011

Когда я пытаюсь создать динамический экземпляр компонента пользовательского интерфейса Android, он выдает мне «java.lang.InstantiationException».

Код образца:

Class components[] = {TextView.class, Button.class,...}
Component mControl = null;
...
...
mControl = (Component) components[nIndexOfControl].newInstance();

Может ли кто-нибудь подсказать мне, как лучше всего достичь вышеуказанного, поскольку я хочу сохранить if..else для каждого виджета?

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

Класс 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, чтобы создать экземпляр всего пользовательского интерфейса (потомков View) элементы управления.


Измените код следующим образом:

Context ctx = ...;
Class<?> components[] = {TextView.class, Button.class };
Constructor<?> ctor = components[nIndexOfControl].getConstructor(Context.class);
Object obj = ctor.newInstance(ctx);
0 голосов
/ 28 июня 2011

Я искал в 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 с параметрами», который находит несколько подходов для работы со случаем «класс не имеет нулевого конструктора», включая некоторые результаты из StackOverflow.

В вашем списке классов нет классов массивов, примитивных типов или 'void', и «какая-то другая причина» маловероятна (и все равно будет объяснена в сообщении об исключении). Если класс абстрактный или интерфейс, то вы просто не можете создать его экземпляр.

0 голосов
/ 28 июня 2011

Нет конструктора по умолчанию для Просмотр объектов .Взгляните на javadoc для Class.newInstance () .Выдает InstantiationException, если не найдено подходящего конструктора.

...