Как разместить новые ресурсы-заполнители в проекте Android Studio ( "инструменты: образец" )?

Фон

Иногда вы хотите поместить некоторые заполнители для отображения только в среде IDE в файлах макетов.

В качестве примера вы можете использовать это:

<ImageView tools:src="@tools:sample/avatars" ... />

И получите это в предварительном просмотре:

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

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

Это то, что мне сказали из здесь:

С образцовыми данными в 3.0 вы можете теперь иметь изображения-заполнители, которые а не часть скомпилированного apk. Вам просто нужен каталог sampledata в ваш проект с подкаталогом, содержащим все изображения, которые вы хотите использовать в качестве заполнителей. Вы можете ссылаться на эти изображения из "инструментов", атрибутов. Кроме того, есть предопределенные фондовые изображения, такие как @sample/avatars или @sample/background/scenic

Проблема

Я не могу найти, как добавить больше таких изображений в проект (так что они будут использоваться только в среде IDE, а не в APK), и если есть способ разместить другие ресурсы, кроме изображений.

На самом деле я не могу найти документы этой функции.

Что я пробовал

Я попытался поместить изображение на "res/sampledata" и попробовал "res/sample", но в обоих случаях мне не удалось найти его.

Вопросы

  • Что такое название этой функции?
  • Как я могу поместить файл изображения в проект и использовать его как заполнитель таким образом? В какой папке?
  • Можно ли добавить больше изображений, которые будут использоваться таким образом?
  • Можно ли добавить другие ресурсы? Макеты? Строки?
  • Есть ли дополнительные возможности этой новой функции?

Ответ 1

Что такое название этой функции?

Неподтвержден официальным источником, но скорее всего он называется "Sample Data".

Как я могу поместить файл изображения в проект и использовать его как заполнитель таким образом? В какой папке?

В отличие от ресурсов, таких как изображения, шрифты и т.д. Образцы данных не входят в /res/ (они не компилируются с помощью приложения, следовательно. Вероятно, проще их отфильтровывать, помещая их в полностью отдельный каталог), Они входят в /app/sampledata/, например: /app/sampledata/image.png.

Вы можете создать папку sampledata, щелкнув правой кнопкой мыши на приложении и сделав New > Sample Data directory:

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

Затем вы можете ссылаться на них следующим образом: @sample/

<ImageView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    tools:src="@sample/test.png" />

В то время как это не дает никаких ошибок, к сожалению, функция кажется прослушиваемой прямо сейчас, поскольку изображения не отображаются в предварительном просмотре, независимо от того, помещены ли они в подкаталог или нет (попробуйте png, jpeg, jpg, xml).

Интересно, что размещение одного изображения в подкаталоге и обращение к этому подкаталогу вместо конкретного изображения, похоже, работает:

Структура этого

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

В сочетании с этими ссылками

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

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        tools:src="@sample/avatar" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        tools:src="@sample/jpeg" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        tools:src="@sample/vector" />

</LinearLayout>

Производит этот предварительный просмотр. Обратите внимание на то, как я использовал tools:background, чтобы установить фон макета на образец изображения.

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

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

Да, просто добавьте их в папку.

Можно ли добавить другие ресурсы? Макеты? Строки?

Он также не поддерживается. Если вы попытаетесь определить какой-либо другой тип ресурса, вы получите кучу синтаксических ошибок из-за того, что ключевые слова не распознаются, или вы не можете ссылаться на них с помощью обозначения tools:src="@sample/.

Есть ли дополнительные возможности этой новой функции?

Не уверен в это время.

Ответ 2

Со своей стороны я пытался использовать файл изображения в качестве заполнителя для просмотра изображений, используя tools:src="...": я поместил свой файл PNG в подкаталог sampledata, но он либо не отображался, либо отображался как испорченное изображение.

После небольшой тряски я нашел кое-что, что решило мою проблему:

  • создайте подкаталог sampledata с именем: drawable
  • Поместите файл png/jpg в этот каталог и добавьте имя файла с помощью _drawable. Пример: image.pngimage_drawable.png

Только тогда появился заполнитель. Вы можете создавать подкаталоги из drawable так, как считаете нужным, чтобы сохранить ваши образы организованными, но важно то, что drawable остается родительским каталогом.

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

Ответ 3

Я думаю, что вы получили ответ на другие вопросы именно от людей, которые ответили до меня, но я могу дать вам обходное решение именно для этого вопроса

Можно ли добавить больше изображений для использования таким образом?

Я сталкивался с этой проблемой довольно долго и нашел для нее обходной путь.

Моя проблема заключалась в том, что я не мог использовать placeHolderImage в SimpleDraweeView, который является частью библиотеки Фреско Facebook, если вы не знали. Но поскольку ImageView не так сложен, как SimpleDraweeView, и поскольку обходной путь работал с SimpleDraweeView, даже если я не пробовал его с ImageView, он, безусловно, мог бы работать и с ним.

Вот решение.

Вам просто нужно создать файл json внутри папки семплов данных, но на этот раз вы должны сделать это следующим образом.

    {
      "data": [
        {
          "image": "@drawable/ic_jam_jar"
        },
        {
          "image": "@drawable/ic_rice_bag"
        },
        {
          "image": "@drawable/store_avatar"
        },
        {
          "image": "@drawable/exclamation_icon"
        }
      ]
   }

Как видите, я использовал ссылку на ресурс drawable вместо значения клавиши image. И это работает в моем случае. Таким образом, вы получаете массив графических ресурсов, которые вы можете использовать внутри элемента RecyclerView для предварительного просмотра в режиме просмотра в Android Studio.

Мой код RecyclerView выглядит следующим образом

<androidx.recyclerview.widget.RecyclerView
                        android:id="@+id/product_desc_rec_view"
                        android:layout_width="match_parent"
                        android:layout_height="350dp"
                        tools:itemCount="6"
                        app:spanCount="6"
                        android:orientation="vertical"
                        app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
                        tools:listitem="@layout/product_desc_item"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />

Не забудьте пропустить ни один из дополнительных тегов, которые я использовал, так как он может не дать требуемого вывода при предварительном просмотре, если вы пропустите какой-либо из них. Вы можете настроить значение атрибута itemCount в соответствии с вашим требованием количества изображений, которые вы используете. Кроме того, orientation может быть vertical или horizontal в зависимости от вашего варианта использования.

Вы можете просто использовать tools:src="@sample/your_json_file.json/data/image внутри своего XML файла элемента повторного просмотра ImageView, чтобы загрузить туда образцы изображений.

Попробуйте и дайте мне знать, если это работает в вашем случае или нет.