Создание динамического класса Android дает исключение java.lang.InstantiationException

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

Образец кода:

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

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

3 ответа

Решение

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);

Не существует конструктора по умолчанию для объектов View. Посмотрите на Javadoc для Class.newInstance (). Это бросает InstantiationException если соответствующий конструктор не найден.

Я искал в Google "java class.newInstance" и:

а) Я нашел документацию для класса 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.

б) Предложенный поисковый термин был "java class.newinstance с параметрами", который находит несколько подходов для работы со случаем "класс не имеет нулевого конструктора", включая некоторые результаты из Stackru.

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

Другие вопросы по тегам