Макет <layout> в макете не объявлен в папке базового макета [ошибка]

97

После перехода на Android Studio 3.2, API 28, в макете приложения появляется следующая ошибка:

Макет в макете не имеет объявления в папке базового макета; это может привести к сбоям при запросе ресурса в конфигурации, не соответствующей этому квалификатору.

Один из макетов, при котором я получаю эту ошибку:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@null" >

      <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top|center_horizontal"
            android:adjustViewBounds="true"
            android:contentDescription="@string/hello_world"
            android:src="@drawable/loading_top" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center_horizontal"
            android:adjustViewBounds="true"
            android:contentDescription="@string/hello_world"
            android:src="@drawable/loading_bottom" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:contentDescription="@string/hello_world"
            android:background="@color/white"
            android:layout_marginBottom="5dp"
            android:paddingTop="10dp"
            android:paddingBottom="10dp"
            android:src="@drawable/loading_logo" />

        <ImageView
            android:id="@+id/loading"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center|center_vertical"
            android:layout_marginBottom="0dp"
            android:layout_marginTop="0dp"
            android:contentDescription="@string/hello_world"
            android:scaleType="fitXY"
            android:src="@null" />
    </FrameLayout>
</LinearLayout>

Я получаю сообщение об ошибке в первой строке первого LinearLayout.

Кто-нибудь знает, как решить эту ошибку?

Спасибо

ОБНОВЛЕНИЕ: ответил на мой вопрос, что решило проблему для меня

L Kemp
источник
@L Kemp однажды покажи мне свой логарифм
Виджая Варма Ланке
@Varma на самом деле приложение работает без ошибок. Я просто вижу ошибку, как только открываю xml-файл, но макет этого xml-файла работает нормально
L Kemp
fill_parent устарел с API 8 и заменен на match_parent ViewGroup.LayoutParams
Махди Джавахери
@MahdiJavaheri Спасибо за ваш совет, однако, я уже знал об этом, я постепенно удаляю этот устаревший код.
L Kemp
В моем случае это была проблема, связанная с именем файла, вы также можете проверить, переименовав файл в маленькие заглавные буквы
Акаш Кумар

Ответы:

135

В моем случае закрытие и повторное открытие студии Android решило проблему. Перестройка проекта или очистка кеша не помогли.

вовахост
источник
3
Я вижу это каждый раз, когда добавляю новый файл макета. Перезапуск / восстановление исправляет это, но кто-нибудь нашел основную причину этого?
HBB20,
Обратите внимание, что Build> Clean Project решил проблему для меня.
Vivid Kraig,
54

Вы также можете попробовать это:

Файл => Недействительный кеш / перезапуск => Недействительный и перезапуск.

снимок экрана

Itoun
источник
2
Да, помогает, но странно, что в предыдущих версиях помогало Build> Rebuild Project. Они что-то разбили.
CoolMind
Я добавил вам один плюс, так как ваши решения работают на AS 3.2 (в моем случае без Eclipse).
CoolMind
15

В моем случае это было использование заглавных букв в имени файла. Я оставил все строчными буквами и это было исправлено.

Зиох
источник
Это была моя проблема. Какая странная ошибка. Просто сделал это строчными буквами, и все было хорошо.
Панама Джек,
10

Если вы разрабатываете свой макет: layout-sw320dp layout-sw480dp layout-sw600dp layout-sw720dp

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

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

Аюб Анбара
источник
6

Я получил эту ошибку при перемещении файлов макета между модулями Gradle . Мне не нужно было заходить так далеко, чтобы аннулировать кеши, поскольку это разрешилось само, когда я перезапускал Android Studioи очищал проект . Похоже, это ошибка IDE .

Трэвис Кастильо
источник
5

В моем случае я решил это следующим образом :

Android сообщает мне эту ошибку идентификатора: MissingDefaultResource, как говорится в документации:

Если ресурс определен только в папках с такими квалификаторами, как -land или -en, и в базовой папке нет объявления по умолчанию (макет или значения и т. Д.), Тогда приложение выйдет из строя, если к этому ресурсу будет осуществлен доступ на устройстве, на котором это устройство в конфигурации отсутствует данный квалификатор.

Как особый случай, чертежи не нужно указывать в базовой папке; если есть совпадение в папке плотности (например, drawable-mdpi), это изображение будет использоваться и масштабироваться. Однако обратите внимание, что если вы укажете только drawable в папке, например drawable-en-hdpi, приложение выйдет из строя в неанглийских языков.

Могут быть сценарии, в которых у вас есть ресурс, такой как -fr drawable, на который ссылается только какой-либо другой ресурс с такими же квалификаторами (например, стиль -fr), который сам по себе имеет безопасные резервные варианты. Тем не менее, это все еще позволяет кому-то случайно ссылаться на drawable и сбой, поэтому безопаснее создать фиктивный резервный вариант по умолчанию в базовой папке. В качестве альтернативы вы можете подавить проблему, добавив в элемент tools: ignore = "MissingDefaultResource".

(Этот сценарий часто случается с переводами строк, когда вы можете удалить код и соответствующие ресурсы, но забыть удалить перевод. Для этого сценария существует специальный идентификатор задачи с идентификатором ExtraTranslation.)

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      tools:ignore="MissingDefaultResource" <!--this-->
      android:layout_width="match_parent"
      android:layout_height="match_parent">

Но это простое решение, потому что вы лишаетесь ресурса в Android.

Я решаю это с помощью опции файловой системы . Если Android сообщает вам об отсутствии ресурса, это означает, что чего-то не хватает, и вам следует его пополнить.

вам нужно перейти в \ app \ src \ main \ res

возможно: щелкните правой кнопкой мыши в отсутствующей папке файла, отобразите в Exporer и вернитесь в \ app \ src \ main \ res

Вы должны найти

/layout

/layout-normal

/layout-large

/some more folders

Вы должны найти, где файлы отсутствуют. В моем случае этого нет в / layout

Уолтер Паласиос
источник
5

я только что сделал Build > Clean Project

rmirabelle
источник
3

В моем случае эта проблема была вызвана прописной буквой. Неправильные символы, такие как "-", также могут вызывать проблему. Я изменил имя с Activity_disease.xmlна, activity_disease.xmlи проблема исправлена.

Дани Нуньес
источник
2

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

Рахул
источник
1

В моем случае кажется, что Google ожидал (или, по крайней мере, принимал) разные имена между разными макетами; У меня были time_dialog.xmlи а time_dialog_landscape.xml. Переименование последнего, чтобы time_dialog.xmlустранить проблему.

Джон Перри
источник
1

Я решил эту проблему, просто синхронизировав проект с gradle

мемресубаси
источник
1

Для меня следующие шаги заставили его работать:

  1. Вырежьте весь код со страницы ( ctrl+ A+X для windows)
  2. Вставьте код обратно.
Вандер
источник
Что-то, что я сделал и для аналогичной проблемы strings.xml, я согласен с этим
Кевин Мёрви
0

Эта проблема, похоже, возникает из-за того, что студия или компилятор не может найти файл ресурсов в папке базового макета. Чтобы решить эту проблему, вам может потребоваться создать файл в разных папках макета. Если вы используете папки макетов v21, v25 и т. Д. Для разработки макетов для различных целевых устройств, вам также может потребоваться разместить туда свои файлы ресурсов.

Ринту
источник
0

В моем случае это предупреждение появилось из-за «неправильного» символа (точки) в имени значения:

<dimen name="dp.divider.xlarge">24dp</dimen>

Удаление точек (щелчок правой кнопкой мыши по имени, затем рефакторинг-переименование в Android Studio) решило проблему.

Таха
источник
0

Поздно на вечеринку, но мой случай отличается от приведенного выше.

Я просто переименовал ресурс, и он заработал.

На самом деле имя моего ресурса было ic_menu_black_24dp.xml, поэтому оно конфликтовало с ресурсом меню Android.

Ашиш Шукла
источник
он не должен конфликтовать, поскольку системные ресурсы находятся в другом пространстве имен, и даже если бы они были, переопределение вашей локальной копией должно было быть нормальным.
Брилл Паппин
1
На самом деле я получил ту же ошибку, что и OP, это произошло по другим причинам, не перечисленным выше, поэтому я решил ее с помощью вышеуказанного шага. Я опубликовал это, если кто-то сталкивается с такой же проблемой, как моя, может получить помощь.
Ашиш Шукла
0

У меня сработало удаление атрибута id

android:id="@+id/[id same as filename]"

из ресурса макета.

Рууд Зиберски
источник
0

Что для меня решило:

В Android Studio щелкните правой кнопкой мыши имя файла в каталоге макета и выберите « Переформатировать код». , не устанавливая специальный флажок на следующем экране.

Не уверен, что именно здесь происходит под капотом, но это сработало.

Разван_ТК9692
источник
0

У меня возникла проблема после копирования / вставки кода в файл макета XML, но я исправил ее, просто создав файл вручную. Очень странно, поскольку код был точно таким же, но каким-то образом исправил эту проблему. Я попытался перезапустить и выполнить исправление «File => Invalidate Caches / Restart => Invalidate and Restart», но проблема была устранена только путем ручного воссоздания файла.

оггинатор
источник
0

Обратите внимание, что когда вы используете разные версии макета, такие как ( Large / Small / Nornal ), тогда у вас должна быть одна и та же основная папка макета. вот так

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

панкадж кумар
источник
0

В моем случае отображалась та же ошибка, потому что файл макета и имя файла макета были разными.

Мой случай: макет -> макет my_layout_land -> my_layout

Я решил это, сделав оба имени файла одинаковыми. Потому что, если вы используете layout-land и у вас есть файл в layout-land, тогда у вас также должен быть файл в папке layout.

Уджавал Кумар
источник
0

Я скопировал файлы xml в папку с помощью проводника Windows. Похоже, это вызвало проблему с кодировкой. После удаления файлов и копирования их в Android Studio проблема была решена.

L Kemp
источник