Подтвердить что ты не робот

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

4b9b3361

Ответ 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 автоматически)

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

Ответ 3

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

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

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

Ответ 5

Это также может быть связано с тем, что вы используете неправильную тему для рендеринга макетов. Убедитесь, что вы выбрали тот, который вы используете в своем проекте.

enter image description here