it-swarm.com.ru

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

44
Naetmul

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

 enter image description here

ссылка

14
Badamchi Davoud

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

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

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

4
SleepyTonic

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

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

  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» в этот класс, проверяя, нет ли ошибок на каждом этапе ...

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

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

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

4
yvolk

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

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

1
Naetmul

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

 enter image description here

0
Javier Mendonca