Редактор макета 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-файл с помощью пользовательских представлений? Что случилось с этим?

Столкнувшись с одной и той же проблемой, мне пришлось переопределить три и четыре конструктора аргументов:

public View(Context context, AttributeSet attrs, int defStyle) public View(Context context, AttributeSet attrs, int defStyle, int defStyleRes)

Затем перестройте проект.

Пользовательские компоненты просмотра также поддерживаются и отображаются правильно в IDEA, но так как IntelliJ IDEA использует файлы классов из вашего выходного каталога для рендеринга таких компонентов, вам сначала нужно сделать build-> make project в своем проекте.

Введите описание изображения здесь

Справка

Как я узнал сегодня, наконец, ошибки «Classdef not found» и т. Д. Во время макетирования фактически вводят в заблуждение. На самом деле это означает, что во время выполнения вашего виджета есть некоторая ошибка.

Самый простой способ узнать, где именно лежит эта проблема, заключается в следующем:

  1. В вашем файле макета XML замените пользовательский класс представления (назовем его «MyFrameLayout» для ясности) с классом акций Android (например, с FrameLayout) и убедитесь, что редактор макета работает. Добавьте атрибуты «tools: …», чтобы вы могли видеть контент, а не пустой макет. Например, если у вас есть виджет EditText в своем пользовательском представлении, добавьте к нему этот атрибут, который будет использоваться только в режиме разработки:

     tools:text="Sample content" 

(«Инструменты: пространство имен добавлено Android Studio автоматически)

  1. Верните исходное имя класса (например, «MyFrameLayout») в макет XML. Он работает сейчас?

Если не:

  1. Скопируйте определение своего пользовательского представления во временный новый класс (например, «MyFrameLayoutBeforeFix») для удобства. Вы будете использовать его для сравнения с классом «MyFrameLayout», который вы сейчас начнете изменять.

  2. Восстановите свой класс «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); } } 
  3. Убедитесь, что это настраиваемое представление отображается нормально. Он должен, по крайней мере, в 2016 году!

  4. Переместите код по частям из копии «MyFrameLayoutBeforeFix» в этот класс, проверяя, что на каждом шаге нет ошибок …

Выше последовательность кажется очевидной, но это сработало для меня. Хитрость заключается в том, что редактор макета запускает ваш класс в своем собственном контексте, и это может вызвать некоторые непредвиденные ошибки в вашем коде, который «работает» при запуске из вашего приложения …

Еще один трюк – использовать isInEditMode() проверить код вашего виджета, чтобы пропустить части, которые могут не работать в представлении «Дизайн». Например:

MyClass myClass = isInEditMode() ? null : MyClass.getInstance();

Должно быть зафиксировано следующим фиксацией.

https://android-review.googlesource.com/#/c/59090/