Решение, которое мы закончили, состояло из нового IResourceResolver
с пользовательским Context
, а не с обычным TemplateResolver
. Мы выбрали это, потому что в большинстве случаев мы все еще хотели использовать сканирование классов, но иногда имели динамический контент.
Ниже показано, как мы это сделали:
public class StringAndClassLoaderResourceResolver implements IResourceResolver {
public StringAndClassLoaderResourceResolver() {
super();
}
public String getName() {
return getClass().getName().toUpperCase();
}
public InputStream getResourceAsStream(final TemplateProcessingParameters params, final String resourceName) {
Validate.notNull(resourceName, "Resource name cannot be null");
if( StringContext.class.isAssignableFrom( params.getContext().getClass() ) ){
String content = ((StringContext)params.getContext()).getContent();
return IOUtils.toInputStream(content);
}
return ClassLoaderUtils.getClassLoader(ClassLoaderResourceResolver.class).getResourceAsStream(resourceName);
}
public static class StringContext extends Context{
private final String content;
public StringContext(String content) {
this.content = content;
}
public StringContext(String content, Locale locale) {
super(locale);
this.content = content;
}
public StringContext(String content, Locale locale, Map<String, ?> variables) {
super(locale, variables);
this.content = content;
}
public String getContent() {
return content;
}
}
Тестовый пример
public class StringAndClassLoaderResourceResolverTest {
private static SpringTemplateEngine templateEngine;
@BeforeClass
public static void setup(){
TemplateResolver resolver = new TemplateResolver();
resolver.setResourceResolver(new StringAndClassLoaderResourceResolver());
resolver.setPrefix("mail/"); // src/test/resources/mail
resolver.setSuffix(".html");
resolver.setTemplateMode("LEGACYHTML5");
resolver.setCharacterEncoding(CharEncoding.UTF_8);
resolver.setOrder(1);
templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(resolver);
}
@Test
public void testStringResolution() {
String expected = "<div>dave</div>";
String input = "<div th:text=\"${userName}\">Some Username Here!</div>";
IContext context = new StringAndClassLoaderResourceResolver.StringContext(input);
context.getVariables().put("userName", "dave");
String actual = templateEngine.process("redundant", context);
assertEquals(expected, actual);
}
@Test
public void testClasspathResolution(){
IContext context = new Context();
context.getVariables().put("message", "Hello Thymeleaf!");
String actual = templateEngine.process("dummy", context);
String expected = "<h1>Hello Thymeleaf!</h1>";
assertEquals(expected, actual);
}
}
Файл шаблона фиктивного файла в src / main / resources / mail / dummy .html
<h1 th:text="${message}">A message will go here!</h1>
Примечание. Мы использовали Apache CommonsIO IOUtils для преобразования String в InputStream
Я думаю, что вы определили версию ящика v4 в своем классе java или классе kotlin. вот почему он дает вам ошибку
Проверьте, добавили ли вы зависимость.
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
}
Затем используйте тег android.support.v4.widget.DrawerLayout.
Ошибка очевидна. Вы используете Android Support Libraries
в dependencies
, но в layout
вы пытаетесь использовать androidx
.
Например:
Поддержка Android: Libray: com.android.support:appcompat-v7
AndroidX: androidx.appcompat:appcompat:1.0.0
Android Support Libraries
, что означает, что вам нужно переименовать DrawerLayout
в <android.support.v4.widget.DrawerLayout
или обновить проект до AndroidX
.
Чтобы сделать обновление, вы можете сделать это из Android Studio, выполнив Refactor -> Migrate to AndroidX
.
Если вы решите использовать этот способ, следуйте предложениям, представленным Android Studio, он zip
сделает ваш проект, а затем сделает обновление. Это означает, что вы всегда можете вернуться к своему проекту до AndroidX
обновления.
Также есть вероятность, что не все вещи будут работать после обновления и, возможно, потребуется ручная настройка.
blockquote>Или вручную: https://developer.android.com/jetpack/androidx/migrate