← Back to Tutorials Chapter 8

Resources & Assets

Resource Types

Android resources are non-code files organized in the res/ directory. They are accessed via the R class.

DirectoryPurpose
res/drawable/Images, shapes, vector drawables, selectors
res/values/Strings, colors, dimensions, themes, styles
res/layout/XML layout files
res/mipmap/Launcher icons (multiple densities)
res/font/Custom font files (TTF, OTF)
res/raw/Raw files (audio, video, JSON)

String Resources

<!-- res/values/strings.xml -->
<resources>
    <string name="app_name">My Android App</string>
    <string name="welcome_message">Welcome, %1$s!</string>
    <string name="item_count">%d items remaining</string>
    <string-array name="months">
        <item>January</item>
        <item>February</item>
        <item>March</item>
    </string-array>
</resources>

// Access in code
getString(R.string.welcome_message, "Alice")
resources.getStringArray(R.array.months)

// Access in XML
android:text="@string/welcome_message"
android:text="@string/welcome_message"

Color Resources

<!-- res/values/colors.xml -->
<resources>
    <color name="primary">#FF6200EE</color>
    <color name="primaryDark">#FF3700B3</color>
    <color name="accent">#FF03DAC5</color>
    <color name="background">#FFFFFFFF</color>
    <color name="textPrimary">#FF1C1B1F</color>
    <color name="textSecondary">#FF49454F</color>
</resources>

// Access
ContextCompat.getColor(this, R.color.primary)
android:background="@color/background"

Dimens Resources

<!-- res/values/dimens.xml -->
<resources>
    <dimen name="padding_small">8dp</dimen>
    <dimen name="padding_medium">16dp</dimen>
    <dimen name="padding_large">24dp</dimen>
    <dimen name="text_size_title">20sp</dimen>
    <dimen name="text_size_body">14sp</dimen>
    <dimen name="elevation_card">4dp</dimen>
</resources>

// Access
resources.getDimension(R.dimen.padding_medium)
android:padding="@dimen/padding_medium"

Themes & Styles

<!-- res/values/themes.xml (Material 3) -->
<resources>
    <style name="Theme.MyApp" parent="Theme.Material3.DayNight.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorOnPrimary">@color/white</item>
        <item name="colorSecondary">@color/secondary</item>
        <item name="android:colorBackground">@color/background</item>
        <item name="colorSurface">@color/surface</item>
        <item name="colorOnSurface">@color/textPrimary</item>
    </style>

    <style name="Widget.MyApp.Button" parent="Widget.Material3.Button">
        <item name="cornerRadius">12dp</item>
        <item name="iconTint">@color/white</item>
    </style>
</resources>

Drawable Resources

<!-- res/drawable/ic_search.xml (vector drawable) -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="?attr/colorControlNormal"
        android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" />
</vector>

// Shape drawable
<!-- res/drawable/rounded_button.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/primary" />
    <corners android:radius="24dp" />
    <padding android:left="16dp" android:right="16dp"
        android:top="8dp" android:bottom="8dp" />
</shape>

Raw Resources

// res/raw/config.json
InputStream stream = resources.openRawResource(R.raw.config);
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
val jsonString = reader.readText()

// Access in code
R.raw.sound_effect  // Returns resource ID
Exercise: Create a themed Android app with custom colors, a vector drawable icon, custom fonts in res/font/, and string resources supporting English and Spanish (hint: use res/values-es/strings.xml for Spanish localization). Apply the theme globally in the manifest.