Редактор макетов Android Studio не может отображать пользовательские представления
В Android Studio редактор макета не может просмотреть пользовательские представления в xml.
Очень простой пример:
public class MyCustomView extends FrameLayout {
public MyCustomView(Context context) {
super(context);
}
public MyCustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<com.myprojectxxx.view.MyCustomView
android:layout_width="48dp"
android:layout_height="48dp" />
</LinearLayout>
Android Studio всегда говорит,
Проблемы с рендерингом
Не удалось найти следующие классы:
- com.myprojectxxx.view.MyCustomView(исправить путь сборки, создать класс)
Совет. Попробуйте создать проект
Конечно, у меня есть этот класс. Если я нажму "Создать класс", он жалуется, что тот же самый класс уже существует. Если я перестрою этот проект, ничего не изменится.
И, да, проект очень хорошо работает на моем устройстве Android. Кроме того, он очень хорошо работает в Eclipse ADT. Однако в Android Studio всегда говорится, что "КЛАССЫ МОГУТ БЫТЬ НАЙДЕНЫ".
Android Studio не имеет возможности просматривать XML файл с помощью пользовательских представлений? Что не так с этим?
Ответы
Ответ 1
Пользовательские компоненты просмотра также поддерживаются и отображаются правильно в IDEA, но так как IntelliJ IDEA использует файлы классов из вашего выходного каталога для рендеринга таких компонентов, вам сначала нужно сделать build- > make project в своем проекте.
![введите описание изображения здесь]()
ссылка
Ответ 2
Как я узнал сегодня, наконец, ошибки "Classdef not found" и т.д. во время макетирования фактически вводят в заблуждение. На самом деле это означает, что во время выполнения вашего виджета есть некоторая ошибка.
Самый простой способ узнать, где именно лежит задача, заключается в следующем:
-
В вашем файле макета XML замените свой пользовательский класс представления (позвольте называть его "MyFrameLayout" для ясности) с классом Android Stock (например, с FrameLayout) и убедитесь, что редактор макета работает.
Добавьте атрибуты "tools:...", чтобы вы могли видеть контент, а не пустую макет. Например. если у вас есть виджет EditText в своем пользовательском представлении, добавьте к нему этот атрибут, который будет использоваться только в режиме разработки:
tools:text="Sample content"
("tools: namespace добавляется Android Studio автоматически)
- Верните исходное имя класса (например, "MyFrameLayout" ) в макет XML. Он работает сейчас?
Если нет:
-
Скопируйте определение своего пользовательского представления во временный новый класс (например, "MyFrameLayoutBeforeFix" ) для удобства. Вы будете использовать его для сравнения с классом "MyFrameLayout", который вы сейчас начнете изменять.
-
Восстановите свой класс "MyFrameLayout" с нуля, используя Android Studio, начиная с абсолютного минимума: он должен компилироваться. В результате класс Java будет содержать "extends" FrameLayout "и необходимые конструкторы/методы, например, в этом случае:
package com.myprojectxxx.view;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.FrameLayout;
public class MyFrameLayout extends FrameLayout {
public MyFrameLayout(Context context) {
super(context);
}
public MyFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
-
Убедитесь, что это настраиваемое представление отображается нормально. Он должен, по крайней мере, в 2016 году!
-
Переместите код по частям из копии "MyFrameLayoutBeforeFix" в этот класс, проверяя, что на каждом шаге нет ошибок...
Выше последовательность кажется очевидной, но это сработало для меня. Фокус в том, что редактор макета запускает ваш класс в своем собственном контексте, и это может вызвать некоторые непредвиденные ошибки в вашем коде, который "работает" при запуске из вашего приложения...
Другим трюком является использование isInEditMode()
проверки вашего кода виджета, чтобы пропустить части, которые могут не работать в представлении "Дизайн". Например:.
MyClass myClass = isInEditMode() ? null : MyClass.getInstance();
Ответ 3
Опираясь на ту же проблему, мне пришлось переопределить три и четыре конструктора аргументов:
public View(Context context, AttributeSet attrs, int defStyle)
public View(Context context, AttributeSet attrs, int defStyle, int defStyleRes)
Затем перестройте проект.
Ответ 4
Должен быть исправлен следующим фиксацией.
https://android-review.googlesource.com/#/c/59090/
Ответ 5
Это также может быть связано с тем, что вы используете неправильную тему для рендеринга макетов. Убедитесь, что вы выбрали тот, который вы используете в своем проекте.
![enter image description here]()