Managing Resources
1. Accessing String Resources
| Resource Type | Access Method | Description |
|---|---|---|
| strings.xml | getString(R.string.resource_name) |
Access string values defined in res/values/strings.xml |
| string array | resources.getStringArray(R.array.array_name) |
Retrieve an array of strings from res/values/arrays.xml |
| quantity strings | getQuantityString(R.plurals.plural_name, quantity) |
Access localized plural forms based on quantity |
Example: Using String Resources
val greeting = getString(R.string.hello_world)
val itemCount = resources.getQuantityString(R.plurals.items, 5, 5)
Note: String resources support placeholders like
%s for dynamic content.
Example: Formatting Strings with Placeholders
val name = "Alice"
val formattedString = getString(R.string.greeting_with_name, name)
2. Using String Formatting
| Format Type | Description | Example | Result |
|---|---|---|---|
| %s | String format | "Hello, %s!".format("World") |
Hello, World! |
| %d | Integer format | "Age: %d".format(25) |
Age: 25 |
| %.2f | Float with 2 decimal places | "Price: %.2f".format(12.345) |
Price: 12.35 |
| %b | Boolean format | "Is it true? %b".format(true) |
Is it true? true |
| %c | Character format | "First letter: %c".format('A') |
First letter: A |
Example: String formatting with variables
val name = "Alice"
val age = 30
val message = "Hello, %s! You are %d years old.".format(name, age)
println(message)
Example: Formatting floating-point numbers
val price = 99.99
val tax = 10.0
val total = price + (price * tax / 100)
println("Total cost: %.2f".format(total))
Note: The
format() method is available on String objects in Kotlin and supports various format specifiers like %s, %d, %.2f, etc.
3. Working with Plurals
| Resource Type | File Location | Description |
|---|---|---|
| plurals | res/values/strings.xml |
Defines plural forms for quantities in different languages |
Example: Defining Plurals in XML
<plurals name="items_count">
<item quantity="zero">No items</item>
<item quantity="one">One item</item>
<item quantity="two">Two items</item>
<item quantity="few"># items</item>
<item quantity="many"># items</item>
<item quantity="other"># items</item>
</plurals>
Example: Using Plurals in Kotlin
val count = 5
val message = getString(R.string.items_count, count)
// Displays "5 items" based on the plural rule for the current locale
Note: The
quantity attribute values depend on the plural rules of the target language. For example, some languages have special rules for zero, one, two, few, many, and other quantities.4. Accessing Drawable Resources
| Resource Type | Access Method | Description |
|---|---|---|
| drawable | Context.getDrawable() |
Retrieve a drawable resource by ID |
| mipmap | Context.getDrawable() |
Access launcher icons or app icons |
Note: Drawable resources should be placed in
res/drawable/ directory.
Warning: Avoid loading large drawables directly into memory as it may cause OutOfMemoryError.
5. Using Color Resources
| Resource Type | File Location | Description |
|---|---|---|
| color | res/values/colors.xml |
Defines color values for use in the app |
Example: Defining a Color Resource
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="primary_color">#3F51B5</color>
<color name="accent_color">#FF4081</color>
<color name="text_primary">#212121</color>
</resources>
Example: Using a Color Resource in Layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World"
android:textColor="@color/text_primary"
android:background="@color/primary_color" />
</LinearLayout>
Example: Using a Color Resource in Code
val primaryColor = ContextCompat.getColor(this, R.color.primary_color)
val textView = findViewById<TextView>(R.id.textView)
textView.setTextColor(primaryColor)
Note: Color resources can also be defined using
ColorStateList for different states like pressed or disabled.| Color State | Description | Usage |
|---|---|---|
| normal | Default color | @color/color_name |
| pressed | Color when view is pressed | @color/color_name_pressed |
| disabled | Color when view is disabled | @color/color_name_disabled |
6. Working with Dimension Resources
| Resource Type | File Location | Description |
|---|---|---|
| dimen | res/values/dimens.xml |
Defines dimension resources for sizes, padding, margins, etc. |
Example: Defining Dimension Resources
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="text_size_small">12sp</dimen>
<dimen name="margin_normal">16dp</dimen>
<dimen name="button_height">48dp</dimen>
</resources>
Example: Using Dimension Resources in Layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/text_size_small"
android:padding="@dimen/margin_normal" />
</LinearLayout>
Example: Using Dimension Resources in Code
val margin = resources.getDimension(R.dimen.margin_normal)
val textSize = resources.getDimension(R.dimen.text_size_small)
7. Creating Alternative Resources
Alternative resources in Android allow you to provide different versions of your app's resources (like strings, images, layouts) based on device configuration or locale. This helps ensure your app looks and behaves correctly across different devices and environments.
| Resource Type | Qualifier | Description |
|---|---|---|
| drawable | mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi |
Different image densities for various screen densities |
| layout | land, port |
Layouts optimized for landscape or portrait orientation |
| values | en, fr, es |
String and other values localized for different languages |
| values | sw600dp, sw720dp |
Screen size qualifiers for different device sizes |
| values | night |
Dark theme resources for night mode |
Example: Creating Alternative Layouts
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World" />
</LinearLayout>
Example: Creating Alternative Strings
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My App</string>
<string name="welcome_message">Welcome to My App!</string>
</resources>
Note: When creating alternative resources, ensure that the resource qualifiers are correctly specified to avoid conflicts or incorrect resource selection.
8. Using Configuration Qualifiers
| Qualifier | Description | Example |
|---|---|---|
| sw320dp | Smallest width of 320dp | res/values-sw320dp/strings.xml |
| land | Landscape orientation | res/layout-land/activity_main.xml |
| night | Night mode theme | res/values-night/colors.xml |
| en | English locale | res/values-en/strings.xml |
| hdpi | High-density screen | res/drawable-hdpi/icon.png |
Example: Using Configuration Qualifiers for Layouts
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text" />
</LinearLayout>
Note: Configuration qualifiers allow you to provide different resources for various device configurations, such as screen sizes, orientations, and locales.
9. Accessing Raw Resources
| Resource Type | Access Method | Description |
|---|---|---|
| raw | context.openRawResource(R.raw.filename) |
Opens a raw resource file as an InputStream |
| assets | context.assets.open("filename") |
Accesses files in the assets folder as InputStream |
Example: Reading a Raw Resource
val inputStream = context.openRawResource(R.raw.data_json)
val reader = BufferedReader(InputStreamReader(inputStream))
val content = reader.readText()
reader.close()
Note: Raw resources must be placed in
res/raw/ directory and are accessible via their resource ID.
10. Working with Assets
| Asset Type | Description | Usage |
|---|---|---|
| Raw Files | Unprocessed files like images, audio, video, or text files | Stored in res/raw/ directory |
| Drawable Resources | Images and XML drawables used for UI elements | Stored in res/drawable/ directory |
| String Resources | Text strings that can be localized | Stored in res/values/strings.xml |
| Color Resources | Color values defined in XML for consistent theming | Stored in res/values/colors.xml |
Example: Loading a Raw Asset
val inputStream = assets.open("data.json")
val jsonString = inputStream.bufferedReader().use { it.readText() }
Example: Loading a Drawable Resource
val drawable = ContextCompat.getDrawable(this, R.drawable.icon)
Note: Assets are read-only and cannot be accessed via resource IDs. They must be opened using the
AssetManager.
Warning: Large asset files can increase app size and impact performance. Consider using
res/drawable or res/raw appropriately.