Пользовательский вид не отображается в режиме предварительного просмотра, если он определен в модуле gradle - PullRequest
0 голосов
/ 26 января 2019

Я создал пример проекта, чтобы показать это поведение.Он имеет 2 модуля - один модуль приложения и один модуль библиотеки.

Модуль библиотеки определяет три вещи:

  1. Некоторые ресурсы - цвета, строки и т. Д.
  2. Пользовательский вид, который использует эти ресурсы
  3. Ресурс макета, который использует это настраиваемое представление.

Модуль приложения определяет только действие, которое использует файл макета библиотеки.

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

java.lang.ClassNotFoundException: com.example.library1.R$color
at org.jetbrains.android.uipreview.ModuleClassLoader.load(ModuleClassLoader.java:190)
at com.android.tools.idea.rendering.RenderClassLoader.findClass(RenderClassLoader.java:61)
at org.jetbrains.android.uipreview.ModuleClassLoader.findClass(ModuleClassLoader.java:124)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.jetbrains.android.uipreview.ModuleClassLoader.loadClass(ModuleClassLoader.java:224)
at com.example.library1.CustomView.<init>(CustomView.kt:19)
at com.example.library1.CustomView.<init>(CustomView.kt:15)
at com.example.library1.CustomView.<init>(CustomView.kt)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:403)
at org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:186)
at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:144)
at com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:299)
at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:418)
at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:429)
at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:333)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:863)
at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:72)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:837)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:325)
at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:385)
at com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:193)
at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:509)
at com.android.tools.idea.rendering.RenderTask.lambda$inflate$4(RenderTask.java:638)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Из того, что я понял, Android Studio не может найти R-файл библиотеки.Я пробовал много вещей: аннулирование кэшей, перестройка, обновление, и, похоже, это не решает эту проблему.

Пример проекта можно посмотреть по адресу https://github.com/asitnkova/CustomViewInLibrary

Вот как это выглядиткак в AndroidStudio .Вы можете ясно видеть, что в макете есть три вида, но визуализируются только два.И вот как это выглядит на устройстве .

...