From c6cb8a78d03cda44a49a990b4d4153560bee7420 Mon Sep 17 00:00:00 2001 From: Scott Main Date: Fri, 9 Apr 2010 15:52:18 -0700 Subject: [PATCH] docs: revisions to the new resources doc based on editorial feedback plus some fixes to resource references and other misc revisions Change-Id: I7b498858d9d0ecfd8cf9bad48c08c93047d597b8 --- .../guide/topics/resources/accessing-resources.jd | 247 +++++++---- .../guide/topics/resources/animation-resource.jd | 56 +-- .../guide/topics/resources/available-resources.jd | 17 + .../guide/topics/resources/drawable-resource.jd | 42 +- docs/html/guide/topics/resources/index.jd | 4 +- .../html/guide/topics/resources/layout-resource.jd | 12 +- docs/html/guide/topics/resources/menu-resource.jd | 26 +- .../guide/topics/resources/providing-resources.jd | 491 +++++++++++++-------- .../html/guide/topics/resources/runtime-changes.jd | 136 +++--- .../images/resources/res-selection-flowchart.png | Bin 23228 -> 32754 bytes 10 files changed, 605 insertions(+), 426 deletions(-) mode change 100755 => 100644 docs/html/images/resources/res-selection-flowchart.png diff --git a/docs/html/guide/topics/resources/accessing-resources.jd b/docs/html/guide/topics/resources/accessing-resources.jd index e3e40550a57a..cf8970c9b5ae 100644 --- a/docs/html/guide/topics/resources/accessing-resources.jd +++ b/docs/html/guide/topics/resources/accessing-resources.jd @@ -22,12 +22,13 @@ parent.link=index.html

In this document

    -
  1. Accessing Resources in Code
  2. -
  3. Accessing Resources in Other XML Resources +
  4. Accessing Resources from Code
  5. +
  6. Accessing Resources from XML
    1. Referencing style attributes
  7. +
  8. Accessing Platform Resources

See also

@@ -39,154 +40,194 @@ parent.link=index.html -

There are two ways you can reference your resources for use in your application:

+ + +

Once you provide a resource in your application (discussed in Providing Resources), you can apply it by +referencing its resource ID. All resource IDs are defined in your project's {@code R} class, which +the {@code aapt} tool automatically generates.

+ +

When your application is compiled, {@code aapt} generates the {@code R} class, which contains +resource IDs for all the resources in your {@code +res/} directory. For each type of resource, there is an {@code R} subclass (for example, +{@code R.drawable} for all drawable resources) and for each resource of that type, there is a static +integer (for example, {@code R.drawable.icon}). This integer is the resource ID that you can use +to retrieve your resource.

+ +

Although the {@code R} class is where resource IDs are specified, you should never need to +look there to discover a resource ID. A resource ID is always composed of:

+ + +

There are two ways you can access a resource:

-

Accessing Resources in Code

+

Accessing Resources in Code

-

When your application is compiled, Android generates the {@code R.java} file (inside -the {@code gen/} directory), which contains resource -identifiers to all the resources in your {@code res/} directory. For each type of resource, a -specific subclass is added to the {@code R} class (for example, -{@code R.drawable}) and for each resource of that type, a static -integer is added to the subclass (for example, -{@code R.drawable.icon}). This integer is the resource ID and you can use it to retrieve -your resource from your application code.

+

You can use a resource in code by passing the resource ID as a method parameter. For +example, you can set an {@link android.widget.ImageView} to use the {@code res/drawable/myimage.png} +resource using {@link android.widget.ImageView#setImageResource(int) setImageResource()}:

+
+ImageView imageView = (ImageView) findViewById(R.id.myimageview);
+imageView.setImageResource(R.drawable.myimage);
+
+

You can also retrieve individual resources using methods in {@link +android.content.res.Resources}, which you can get an instance of +with {@link android.content.Context#getResources()}.

-

Caution: You should never modify the {@code -R.java} file by hand—it is generated by the {@code aapt} tool when your project is -compiled. Any changes will be overridden next time you compile.

+

Syntax

-

Here is the syntax to reference a resource in code:

-

-[<package_name>.]R.<resource_type>.<resource_name> -

+

Here's the syntax to reference a resource in code:

+ +
+[<package_name>.]R.<resource_type>.<resource_name>
+

See Resource Types for more information about each resource type and how to reference them.

-

In many cases, you can supply an API method with the resource ID. For example, to set the image -for an {@link android.widget.ImageView}:

-
-ImageView iv = (ImageView) findViewById(R.id.myimageview);
-iv.setImageResource(R.drawable.myimage);
-
-

You can also retrieve your -resource objects using methods in {@link android.content.res.Resources}, which you can create an -instance of with {@link android.content.Context#getResources Context.getResources()}. For example, -to get a string:

-
-Resources res = this.getResources();
-String string = res.getString(R.string.mystring);
-
+

Use cases

-

You can also access resources from the platform by prefixing the {@code android} -namespace. Android contains a number of standard resources, such as styles and themes for your -layout, button backgrounds, and layouts. To refer to these in code, qualify your reference with the -android package name. For example, -android.R.layout.simple_gallery_item.

+

There are many methods that accept a resource ID parameter and you can retrieve resources using +methods in {@link android.content.res.Resources}. You can get an instance of {@link +android.content.res.Resources} with {@link android.content.Context#getResources +Context.getResources()}.

-

Here are some examples of using resources in code:

+ +

Here are some examples of accessing resources in code:

 // Load a background for the current screen from a drawable resource
 {@link android.app.Activity#getWindow()}.{@link
 android.view.Window#setBackgroundDrawableResource(int)
-setBackgroundDrawableResource}(R.drawable.my_background_image) ;
+setBackgroundDrawableResource}(R.drawable.my_background_image) ;
 
 // Set the Activity title by getting a string from the Resources object, because
 //  this method requires a CharSequence rather than a resource ID
 {@link android.app.Activity#getWindow()}.{@link android.view.Window#setTitle(CharSequence)
 setTitle}(getResources().{@link android.content.res.Resources#getText(int)
-getText}(R.string.main_title));
+getText}(R.string.main_title));
 
 // Load a custom layout for the current screen
 {@link android.app.Activity#setContentView(int)
-setContentView}(R.layout.main_screen);
+setContentView}(R.layout.main_screen);
 
 // Set a slide in animation by getting an Animation from the Resources object
 mFlipper.{@link android.widget.ViewAnimator#setInAnimation(Animation)
 setInAnimation}(AnimationUtils.loadAnimation(this,
-        R.anim.hyperspace_in));
+        R.anim.hyperspace_in));
 
 // Set the text on a TextView object using a resource ID
-TextView msgTextView = (TextView) findViewById(R.id.msg);
-msgTextView.{@link android.widget.TextView#setText(int) setText}(R.string.hello_message);
+TextView msgTextView = (TextView) findViewById(R.id.msg);
+msgTextView.{@link android.widget.TextView#setText(int)
+setText}(R.string.hello_message);
 
+

Caution: You should never modify the {@code +R.java} file by hand—it is generated by the {@code aapt} tool when your project is +compiled. Any changes are overridden next time you compile.

+ + +

Accessing Resources from XML

+

You can define values for some XML attributes and elements using a +reference to an existing resource. You will often do this when creating layout files, to +supply strings and images for your widgets.

+

For example, if you add a {@link android.widget.Button} to your layout, you should use +a string resource for the button text:

+ +
+<Button
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:text="@string/submit" />
+
-

Accessing Resources in other XML Resources

-

When creating an XML resource, some values for attributes and elements can be a reference to -an existing resource. This is often used in layout files to supply strings and images.

+

Syntax

Here is the syntax to reference a resource in an XML resource:

-

@[<package_name>:]<resource_type>/<resource_name>

+ +
+@[<package_name>:]<resource_type>/<resource_name>
+

See Resource Types for more information about each resource type and how to reference them.

-

For example, if you have the following resource file that includes a Use cases + +

In some cases you must use a resource for a value in XML (for example, to apply a drawable image +to a widget), but you can also use a resource in XML any place that accepts a simple value. For +example, if you have the following resource file that includes a color resource and a string resource:

@@ -206,8 +247,8 @@ text string:

<EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:textColor="@color/opaque_red" - android:text="@string/hello" /> + android:textColor="@color/opaque_red" + android:text="@string/hello" />

In this case you don't need to specify the package name in the resource reference because the @@ -219,19 +260,18 @@ reference a system resource, you would need to include the package name. For exa <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:textColor="@android:color/secondary_text_dark" + android:textColor="@android:color/secondary_text_dark" android:text="@string/hello" /> -

Note: You should always use a string resource when supplying -strings in a layout file, as demonstrated above, so that the strings can be localized. For -information about creating alternative resources (such as localized strings), see Note: You should use string resources at all times, so that your +application can be localized for other languages. For information about creating alternative +resources (such as localized strings), see Providing Alternative Resources.

-

This facility for referencing resources between resources can also be used to create -alias resources. For example, you can create new drawable resources that is an alias for an existing -image:

+

You can even use resources in XML to create aliases. For example, you can create a +drawable resource that is an alias for another drawable resource:

 <?xml version="1.0" encoding="utf-8"?>
@@ -239,15 +279,14 @@ image:

android:src="@drawable/other_drawable" />
-

This is discussed further in Creating -alias resources.

- +

This sounds redundant, but can be very useful when using alternative resource. Read more about +Creating alias resources.

Referencing style attributes

-

A style attribute resource is another type of resource that allows you to reference the value +

A style attribute resource allows you to reference the value of an attribute in the currently-applied theme. Referencing a style attribute allows you to customize the look of UI elements by styling them to match standard variations supplied by the current theme, instead of supplying a hard-coded value. Referencing a style attribute @@ -257,28 +296,46 @@ essentially says, "use the style that is defined by this attribute, in the curre format, but instead of the at-symbol ({@code @}), use a question-mark ({@code ?}), and the resource type portion is optional. For instance:

-

- +

 ?[<package_name>:][<resource_type>/]<resource_name>
-
-

+
-

For example, here's how you might reference an attribute in a layout, -to set the text color to match the "primary" text color of the system theme:

+

For example, here's how you can reference an attribute to set the text color to match the +"primary" text color of the system theme:

 <EditText id="text"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
-    android:textColor="?android:textColorSecondary"
+    android:textColor="?android:textColorSecondary"
     android:text="@string/hello_world" />
 
-

Using this markup, you are -supplying the name of an attribute resource that will be looked up in the theme. -Because the system resource tool knows that an attribute resource is expected, +

Here, the {@code android:textColor} attribute specifies the name of a style attribute +in the current theme. Android now uses the value applied to the {@code android:textColorSecondary} +style attribute as the value for {@code android:textColor} in this widget. Because the system +resource tool knows that an attribute resource is expected in this context, you do not need to explicitly state the type (which would be -?android:attr/textColorSecondary), so you can exclude the {@code attr} type.

+?android:attr/textColorSecondary)—you can exclude the {@code attr} type.

+ + + +

Accessing Platform Resources

+ +

Android contains a number of standard resources, such as styles, themes, and layouts. To +access these resource, qualify your resource reference with the +android package name. For example, Android provides a layout resource you can use for +list items in a {@link android.widget.ListAdapter}:

+ +
+{@link android.app.ListActivity#setListAdapter(ListAdapter)
+setListAdapter}(new {@link
+android.widget.ArrayAdapter}<String>(this, android.R.layout.simple_list_item_1, myarray));
+
+

In this example, {@link android.R.layout#simple_list_item_1} is a layout resource defined by the +platform for items in a {@link android.widget.ListView}. You can use this instead of creating +your own layout for list items. (For more about using {@link android.widget.ListView}, see the +List View Tutorial.)

diff --git a/docs/html/guide/topics/resources/animation-resource.jd b/docs/html/guide/topics/resources/animation-resource.jd index b2fab04e4aab..e0ce0515d614 100644 --- a/docs/html/guide/topics/resources/animation-resource.jd +++ b/docs/html/guide/topics/resources/animation-resource.jd @@ -62,18 +62,18 @@ In XML: @[package:]anim/filename android:toXScale="float" android:fromYScale="float" android:toYScale="float" - android:pivotX="string" - android:pivotY="string" /> + android:pivotX="float" + android:pivotY="float" /> <translate - android:fromX="string" - android:toX="string" - android:fromY="string" - android:toY="string" /> + android:fromX="float" + android:toX="float" + android:fromY="float" + android:toY="float" /> <rotate android:fromDegrees="float" android:toDegrees="float" - android:pivotX="string" - android:pivotY="string" /> + android:pivotX="float" + android:pivotY="float" /> <set> ... </set> @@ -158,21 +158,21 @@ android.view.animation.TranslateAnimation}.

attributes:

android:fromXDelta
-
Float or percentage. Starting X offset. Either in: pixels relative to the -normal position, in percentage relative to the element width (%), or relative to the parent width -(%p).
+
Float or percentage. Starting X offset. Expressed either: in pixels relative +to the normal position (such as {@code "5"}), in percentage relative to the element width (such as +{@code "5%"}), or in percentage relative to the parent width (such as {@code "5%p"}).
android:toXDelta
-
Float or percentage. Ending X offset. Either in: pixels relative to the -normal position, in percentage relative to the element width (%), or relative to the parent width -(%p).
+
Float or percentage. Ending X offset. Expressed either: in pixels relative +to the normal position (such as {@code "5"}), in percentage relative to the element width (such as +{@code "5%"}), or in percentage relative to the parent width (such as {@code "5%p"}).
android:fromYDelta
-
Float or percentage. Starting Y offset. Either in: pixels relative to the -normal position, in percentage relative to the element height (%), or relative to the parent height -(%p).
+
Float or percentage. Starting Y offset. Expressed either: in pixels relative +to the normal position (such as {@code "5"}), in percentage relative to the element height (such as +{@code "5%"}), or in percentage relative to the parent height (such as {@code "5%p"}).
android:toYDelta
-
Float or percentage. Ending Y offset. Either in: pixels relative to the -normal position, in percentage relative to the element height (%), or relative to the parent height -(%p).
+
Float or percentage. Ending Y offset. Expressed either: in pixels relative +to the normal position (such as {@code "5"}), in percentage relative to the element height (such as +{@code "5%"}), or in percentage relative to the parent height (such as {@code "5%p"}).

For more attributes supported by <translate>, see the {@link android.view.animation.Animation} class reference (of which, all XML attributes are @@ -183,15 +183,19 @@ inherrited by this element).

attributes:

android:fromDegrees
-
Integer. Starting angular position, in degrees.
+
Float. Starting angular position, in degrees.
android:toDegrees
-
Integer. Ending angular position, in degrees.
+
Float. Ending angular position, in degrees.
android:pivotX
-
Integer or percentage. The X coordinate of the center of rotation, in total -pixels (where 0 is the left edge) or percentage of the screen width.
+
Float or percentage. The X coordinate of the center of rotation. Expressed +either: in pixels relative to the object's left edge (such as {@code "5"}), in percentage relative +to the object's left edge (such as {@code "5%"}), or in percentage relative to the parent +container's left edge (such as {@code "5%p"}).
android:pivotY
-
Integer or percentage. The Y coordinate of the center of rotation, in total -pixels (where 0 is the top edge) or percentage of the screen height.
+
Float or percentage. The Y coordinate of the center of rotation. Expressed +either: in pixels relative to the object's top edge (such as {@code "5"}), in percentage relative +to the object's top edge (such as {@code "5%"}), or in percentage relative to the parent +container's top edge (such as {@code "5%p"}).

For more attributes supported by <rotate>, see the {@link android.view.animation.Animation} class reference (of which, all XML attributes are diff --git a/docs/html/guide/topics/resources/available-resources.jd b/docs/html/guide/topics/resources/available-resources.jd index 19babee6c922..09c55a5a1ab0 100644 --- a/docs/html/guide/topics/resources/available-resources.jd +++ b/docs/html/guide/topics/resources/available-resources.jd @@ -18,6 +18,23 @@ of application resource that you can provide in your resources directory ({@code

Here's a brief summary of each resource type:

+ + +
Animation Resources
Define pre-determined animations.
diff --git a/docs/html/guide/topics/resources/drawable-resource.jd b/docs/html/guide/topics/resources/drawable-resource.jd index ec964ed887d4..d8de16a42999 100644 --- a/docs/html/guide/topics/resources/drawable-resource.jd +++ b/docs/html/guide/topics/resources/drawable-resource.jd @@ -463,11 +463,11 @@ In XML: @[package:]drawable/filename android:centerX="integer" android:centerY="integer" android:centerColor="integer" + android:endColor="color" android:gradientRadius="integer" - android:type="" - android:usesLevel="" android:startColor="color" - android:endColor="color" /> + android:type=["linear" | "radial" | "sweep"] + android:usesLevel=["true" | "false"] /> <solid android:color="color" /> <stroke @@ -544,18 +544,6 @@ a {@link android.graphics.drawable.LevelListDrawable}. This should normally be "
Specifies a gradient color for the shape.

attributes:

-
android:type
-
Keyword. The type of gradient pattern to apply. Valid values are: - - - - - - - - -
ValueDescription
{@code "linear"}A linear gradient. This is the default.
{@code "radial"}A radial gradient. The start color is the center color.
{@code "sweep"}A sweeping line gradient.
-
android:angle
Integer. The angle for the gradient, in degrees. 0 is left to right, 90 is bottom to top. It must be a multiple of 45. Default is 0.
@@ -568,18 +556,30 @@ Does not apply when {@code android:type="linear"}.
android:centerColor
Color. Optional color that comes between the start and end colors, as a hexadecimal value or color resource.
+
android:endColor
+
Color. The ending color, as a hexadecimal +value or color resource.
android:gradientRadius
Float. The radius for the gradient. Only applied when {@code android:type="radial"}.
-
android:useLevel
-
Boolean. "true" if this is used as a {@link -android.graphics.drawable.LevelListDrawable}.
android:startColor
Color. The starting color, as a hexadecimal value or color resource.
-
android:endColor
-
Color. The ending color, as a hexadecimal -value or color resource.
+
android:type
+
Keyword. The type of gradient pattern to apply. Valid values are: + + + + + + + + +
ValueDescription
{@code "linear"}A linear gradient. This is the default.
{@code "radial"}A radial gradient. The start color is the center color.
{@code "sweep"}A sweeping line gradient.
+
+
android:useLevel
+
Boolean. "true" if this is used as a {@link +android.graphics.drawable.LevelListDrawable}.
<solid>
diff --git a/docs/html/guide/topics/resources/index.jd b/docs/html/guide/topics/resources/index.jd index f602a0419c96..2aa697e1402f 100644 --- a/docs/html/guide/topics/resources/index.jd +++ b/docs/html/guide/topics/resources/index.jd @@ -27,14 +27,14 @@ important as more Android-powered devices become available with different config to provide this functionality, you must organize resources in your project's {@code res/} directory, using various sub-directories that group resources by type and configuration.

-
+

Figure 1. Two device configurations, both using default resources.

-
+

Figure 2. Two device configurations, one using alternative diff --git a/docs/html/guide/topics/resources/layout-resource.jd b/docs/html/guide/topics/resources/layout-resource.jd index a6b177f01fc6..2c51d54f41e0 100644 --- a/docs/html/guide/topics/resources/layout-resource.jd +++ b/docs/html/guide/topics/resources/layout-resource.jd @@ -36,14 +36,14 @@ In XML: @[package:]layout/filename <?xml version="1.0" encoding="utf-8"?> <ViewGroup xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/name" - android:layout_height="@+id/string_name" - android:layout_width="@+id/string_name" - [other attributes] > + android:layout_height=["dimension" | "fill_parent" | "wrap_content"] + android:layout_width=["dimension" | "fill_parent" | "wrap_content"] + [ViewGroup-specific attributes] > <View android:id="@+id/name" - android:layout_height="@+id/string_name" - android:layout_width="@+id/string_name" - [other attributes] > + android:layout_height=["dimension" | "fill_parent" | "wrap_content"] + android:layout_width=["dimension" | "fill_parent" | "wrap_content"] + [View-specific attributes] > <requestFocus/> </View> <ViewGroup > diff --git a/docs/html/guide/topics/resources/menu-resource.jd b/docs/html/guide/topics/resources/menu-resource.jd index c9f27fa71d25..badc40328a54 100644 --- a/docs/html/guide/topics/resources/menu-resource.jd +++ b/docs/html/guide/topics/resources/menu-resource.jd @@ -35,12 +35,12 @@ In XML: @[package:]menu.filename

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:id="resource ID"
+    <item android:id="@+id/id_name"
           android:menuCategory=["container" | "system" | "secondary" | "alternative"]
           android:orderInCategory="integer"
           android:title="string"
           android:titleCondensed="string"
-          android:icon="drawable resource"
+          android:icon="@[package:]drawable/drawable_resource_name"
           android:alphabeticShortcut="string"
           android:numericShortcut="string"
           android:checkable=["true" | "false"]
@@ -172,22 +172,22 @@ too long.
 
XML file saved at res/menu/example_menu.xml:
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:id="@+id/example_item"
-          android:title="Example Item"
-          android:icon="@drawable/example_item_icon" />
-    <group android:id="@+id/example_group">
+    <item android:id="@+id/item1"
+          android:title="@string/item1"
+          android:icon="@drawable/group_item1_icon" />
+    <group android:id="@+id/group">
         <item android:id="@+id/group_item1"
-              android:title="Group Item 1"
-              android:icon="@drawable/example_item1_icon" />
+              android:title="@string/group_item1"
+              android:icon="@drawable/group_item1_icon" />
         <item android:id="@+id/group_item2"
-              android:title="Group Item 2"
-              android:icon="@drawable/example_item2_icon" />
+              android:title="G@string/group_item2"
+              android:icon="@drawable/group_item2_icon" />
     </group>
     <item android:id="@+id/submenu"
-          android:title="Sub Menu" >
+          android:title="@string/submenu_title" >
         <menu>
-            <item android:id="@+id/submenu_item"
-                  android:title="Sub Menu Item" />
+            <item android:id="@+id/submenu_item1"
+                  android:title="@string/submenu_item1" />
         </menu>
     </item>
 </menu>
diff --git a/docs/html/guide/topics/resources/providing-resources.jd b/docs/html/guide/topics/resources/providing-resources.jd
index b495eb8a1b22..0f3d38993958 100644
--- a/docs/html/guide/topics/resources/providing-resources.jd
+++ b/docs/html/guide/topics/resources/providing-resources.jd
@@ -7,13 +7,15 @@ parent.link=index.html
 

Quickview

    -
  • Different types of resources belong in different sub-directories of {@code res/}
  • +
  • Different types of resources belong in different subdirectories of {@code res/}
  • Alternative resources provide configuration-specific resource files

In this document

    +
  1. Grouping Resource Types
  2. Providing Alternative Resources
      +
    1. Qualifier name rules
    2. Creating alias resources
  3. @@ -24,17 +26,30 @@ parent.link=index.html
    1. Accessing Resources
    2. Resource Types
    3. +
    4. Supporting Multiple +Screens
-

There are several types of resource files you can -include in your application and each type belongs in a specific sub-directory of your project's -{@code res/} directory. Absolutely no files should be saved directly inside {@code res/}.

+

You should always externalize application resources such as images and strings from your +code, so that you can maintain them independently. You can also provide alternative resources for +specific device configurations, by grouping them in specially-named resource directories. Android +will then automatically apply the appropriate resource based on the current configuration. For +instance, you might want to provide a different UI layout depending on the screen size.

-

For example, here's the file hierarchy for a simple project:

+

Once you save your resources external to your application code, you can access them +using resource IDs that are generated in your project's {@code R} class. How to use +resources in your application is discussed in Accessing +Resources.

-
+
+

Grouping Resource Types

+ +

You should place each type of resource in a specific subdirectory of your project's +{@code res/} directory. For example, here's the file hierarchy for a simple project:

+ +
 MyProject/
     src/  
         MyActivity.java  
@@ -42,23 +57,23 @@ MyProject/
         drawable/  
             icon.png  
         layout/  
-            main_layout.xml  
+            main.xml
+            info.xml
         values/  
             strings.xml  
 
-

This project includes an image resource, a layout resource, and string resource file.

+

The {@code res/} directory contains all the resources (in subdirectories): an image resource, two +layout resources, and a string resource file. The resource directory names are important and are +described in table 1.

-

Table 1 lists the different {@code res/} sub-directories supported -and describes the types of resource files that belong in each one.

- -

Table 1. Resource directories. Each directory -belongs inside the project {@code res/} directory.

+

Table 1. Resource directories +supported inside project {@code res/} directory.

- + @@ -70,13 +85,13 @@ href="animation-resource.html">Animation Resources. +State List Resource system. To open these resources with a raw {@link java.io.InputStream}, call {@link android.content.res.Resources#openRawResource(int) Resources.openRawResource()} with the resource ID, which is {@code R.raw.filename}.

-

However, if you require direct access to original file names and file hierarchy, instead of -using a resource ID to access your files, you might consider saving some resources in the {@code -assets/} directory, instead of {@code res/raw/}. You can query data in the {@code assets/} directory -like an ordinary file system, search through the directory and read raw data using {@link -android.content.res.AssetManager}.

+

However, if you need access to original file names and file hierarchy, you might consider +saving some resources in the {@code +assets/} directory (instead of {@code res/raw/}). Files in {@code assets/} are not given a +resource ID, so you can read them only using {@link android.content.res.AssetManager}.

-
DirectoryResource TypesResource Type
color/ XML files that define a state list of colors. See Color -State List Resources
drawable/

Bitmap files ({@code .png}, {@code .9.png}, {@code .jpg}, {@code .gif}) or XML files that -are compiled into the following Drawable resource subtypes:

+are compiled into the following drawable resource subtypes:

  • Bitmap files
  • Nine-Patches (re-sizable bitmaps)
  • @@ -107,37 +122,35 @@ Menu. See Menu Resource.
values/

XML files that contain simple values, such as strings, integers, and colors.

-

Unlike the other {@code res/} subdirectories, this one - can hold files that contain descriptions of more than one resource, rather than -just one resource for the file. The XML element types of an XML file in {@code values/} control -how these resources are defined in the {@code R} class. For example, a {@code <string>} -element will create an -{@code R.string} resource, and a {@code <color>} element will create an {@code R.color} +

Whereas XML resource files in other {@code res/} subdirectories define a single resource +based on the XML filename, files in the {@code values/} directory describe multiple resources. +For a file in this directory, each child of the {@code <resources>} element defines a single +resource. For example, a {@code <string>} element creates an +{@code R.string} resource and a {@code <color>} element creates an {@code R.color} resource.

-

While the name of a file in this directory is arbitrary and not related to the name given -to a resource produced, you might want to separate different types of resources into different -files for easier maintenance. Here are some filename conventions for some of the different types -of resources you can save here:

+

Because each resource is defined with its own XML element, you can name the file +whatever you want and place different resource types in one file. However, for clarity, you might +want to place unique resource types in different files. For example, here are some filename +conventions for resources you can create in this directory:

See String Resources, Style Resource, and @@ -147,38 +160,42 @@ values.

xml/Arbitrary XML files that are compiled and can be read at runtime by calling {@link + Arbitrary XML files that can be read at runtime by calling {@link android.content.res.Resources#getXml(int) Resources.getXML()}. Various XML configuration files -must also be saved here, such as a searchable configuration.
+

Note: You should never save resource files directly inside the +{@code res/} directory.

+

For more information about certain types of resources, see the Resource Types documentation.

- - +

How to access resources in the {@code res/} subdirectories is discussed in Accessing Resources. +

Providing Alternative Resources

-
+

Figure 1. Two device configurations, one using alternative resources.

Almost every application should provide alternative resources to support specific device -configurations. For instance, you should include different drawable resources for different -screen densities and different string resources for different languages. At runtime, Android -will automatically detect the current device configuration and then load the appropriate +configurations. For instance, you should include alternative drawable resources for different +screen densities and alternative string resources for different languages. At runtime, Android +automatically detects the current device configuration and loads the appropriate resources.

-

For each set of resources for which you want to provide configuration-specific alternatives:

+

To specify configuration-specific alternatives for a set of resources:

  1. Create a new directory in {@code res/} named in the form {@code <resources_name>-<config_qualifier>}. @@ -191,13 +208,13 @@ for which these resources are to be used.
  2. You can append more than one {@code <config_qualifier>}. Separate each one with a dash.

    -
  3. Save your alternative resources in this directory, named exactly the same as the default -resource files.
  4. +
  5. Save your alternative resources in this new directory. The resource files must be named +exactly the same as the default resource files.

For example, here are some default and alternative resources:

-
+
 res/
     drawable/   
         icon.png
@@ -207,22 +224,23 @@ res/
         background.png  
 
-

The {@code hdpi} qualifier indicates that the resources are for devices with a high-density -screen. While the images in each directory are different, the filenames are -identical. This way, the resource ID that you use to reference the {@code icon.png} image is -always the same. When you request the {@code icon} drawable, Android will select the +

The {@code hdpi} qualifier indicates that the resources in that directory are for devices with a +high-density screen. While the images in each drawable directory are sized for a specific screen +density, the filenames are +the same. This way, the resource ID that you use to reference the {@code icon.png} or {@code +background.png} image is always the same, but Android selects the version of that drawable that best matches the current device configuration.

Android supports several configuration qualifiers and you can -add multiple qualifiers to one directory name in order to further specify the configuration, by -separating the qualifiers with dashes. Table 2 lists the valid configuration qualifiers, in order -of precedence—they must be specified in the directory name in the order that they are listed -in the table.

+add multiple qualifiers to one directory name, by separating each qualifier with a dash. Table 2 +lists the valid configuration qualifiers, in order of precedence—if you use multiple +qualifiers, they must be added to the directory name in the order they are listed in the +table.

Table 2. Alternative resource qualifier names.

- +
@@ -237,18 +255,22 @@ names.

etc. +

If the device uses a radio connection (GSM phone), the MCC comes + from the SIM, and the MNC comes from the network to which the + device is connected.

+

You can also use the MCC alone (for example, to include country-specific legal +resources in your application). If you need to specify based on the language only, then use the +language and region qualifier instead (discussed next). If you decide to use the MCC and +MNC qualifier, you should do so with care and test that it works as expected.

+

Also see the configuration fields {@link +android.content.res.Configuration#mcc}, and {@link +android.content.res.Configuration#mnc}, which indicate the current mobile country code +and mobile network code, respectively.

+ @@ -260,22 +282,24 @@ should do so with great care and completely test that it works as expected.

< fr-rCA
etc. - @@ -286,24 +310,27 @@ your application for other langauges.

large @@ -313,12 +340,14 @@ Screens for more information.

notlong @@ -329,11 +358,16 @@ Screens for more information.

square --> @@ -343,12 +377,15 @@ how this affects your application during runtime.

desk @@ -358,13 +395,16 @@ android.app.UiModeManager}.

notnight @@ -376,24 +416,27 @@ also explicitly set this mode using {@link android.app.UiModeManager}.

nodpi @@ -403,25 +446,45 @@ Screens for more information.

stylus
finger - @@ -431,9 +494,17 @@ application during runtime.

qwerty
12key - + @@ -442,13 +513,16 @@ the {@code qwerty} resources.navhidden @@ -459,8 +533,16 @@ information about how this affects your application during runtime.

trackball
wheel - h@fB2@BPu6n+Sj+rrMNMG%Vg-cN2x}2XUg}#L5*0kLRptx zT?M;#(zL&5*A!wiy%t7}y0t^)VI!fn8U_kFDe*pS_b8 z%8v9+EDryVcgfeMr`6YpF8Qc;t>nl^IE|&x*4B-Iatd5A&$q6}3;ssWXPKdrs9hfm zoAXtmpMtHUBjeLcoIyN@-`-}5ok&e1`?nX!U zdh^e^=xERfi-l9;aiF^ZHnzUGNkOK7m*;Fj>>Eho=r$sT$i>BPpw;Yl_d-RKK09Us zjsPDWH}~;;=??7pX^8{=ry>vcf_9C8a|DKMZ(kq&nd2WhGEx&WGk_0=f`&d`ptU$# zo?crk@9d;c)h*1+**bVQe}#eZ{^4rhZX(?as4PG)Lml|@D<79TB%`3-iHXXeyBQ2F}I6Sr}$AAW!Ba0Z9so)z65!N&hsO~!1P$;iSy-*@llOoxC*jmOnIDNI8T#J7!A}S z3I^h!eH<5O-`w6ZPkK5Ys{l_cD9-6RrW^pjl!{s7Ee`ttw<0NnCY;B{PP}bCnZb zDU6zA&&()kgxY%vSkthvRdiVtET@x7=zmoIg(>m`PHg_NkIQxPcoBshv+p_B(Xp>MdH zozvROXy1!Wwn#`x`B6w!evIUR<8&ijH0-K}jvu#Zd12A&=f53{t3)wG3 zf>@v^D|Do-m1yC$t=MUMWXl;ua@AXYX_sSY>TJ8KTSPRt{02i;%;GYnS(xd;LY@;9k(%fb%`@zVP|G&x8LvF zj=3%a5V1S^A-mmrDx%YT28C~fLIN}jhG1gu+;UIbA%ycuAaG~C zbO|%fQ83%?+5_X+UEb?FvEr4vd7Wt@Z1TnCNQOV+BD+HQyx*F2^ilk!8u0gOOLTK# z)MC-EugNBwGojk3YoVwTkQe4vRW4gC8hzLkNKrIH1MKp~Mn+QaPRer{=Il4dDP?j} zSbd9}FuLlYRZmjN8N@S0IK%Yd*K_^qL~;)7br~ydbIg^MV@sb%MF{r%(9=cS2eA8& zn=U4#PY%Vfbn(IRj3qdOYv)hPfvxMr&WKFnnhk>mwKQK=p#(d_n%NVF;&z#^$I_{3 z#f$cyBwJ4#PMM5+(n&;7^km2W?n06?d1H-Cj|8p|+w zEYjWd8{#G4`*TJ3Avz1WQ4u7AutKU8Jq1U_DKDt);0I8_ZKi-ukApd&6%Kpk3`6-L z`J0Fbm;21egiBZl2$wcOO~3W4?eql+oXCufYPO%kY%_t6inR1nz>HY&YLe<8matTP z)y+3jEOzRPE&Aq8UM62GB{~H*43WH~Jw4~R##N6oo;HmYBk>eE@6t`p+?D4Nbf@Ni zUC}8SZ6sN9(p&mmF-+pRNRXAqC0p0|t!qU|QMyAs-|Q9g&*@@0Wqf#37xsZa|1QKo swp_jGed7NlDF07^&Hsl{kDR^w4BLdI;oTkV`vP3j;tFC_A_o5d56#0TGXMYp literal 23228 zcmbTeby!qi^fyWl9U>thr6M3HIdln<0@5KV3^Bxjbc2ADARR+UBPk;#-BLqH4c#aV zQUW4%59;@K?|q;5KKHrz4<9^-eb!!k@3r?@`?J=ENX=(YNeJl(F)%Pll$D-5$H2fG z2L4UsV*zip>{IH2ADC{>pUPoWBJX|&9&jMC>arLZALEEFEO3EmW-F!V>KGV44>2%; zUSnYV23`ey!@zLo!@$@!$G{Lv!@!_%fq&MLz`!sPQ+^_=<7K*={59kE|KZq2yFn$sUcJgA`{gk?sQ#2uGWO6CrUqPZ?zyBuRVWAH0HQX z59;dcULxHqKYacXcsN-Va6J06iZ}3VuV2$l9qoi=xz8=-Mj45`+rWQHa_g7)P--_z= zaSF)hYx_C!q6REJf}_v9TE5(xPe%?3Yf}+q_Vsv5E10R(Xs)mdWlef_XSE#MWJvM` zfn~x9G!aov$0g}k`9KZfd>_+I4(UM++snYImLH7;0nG+I6nJ9_{sV7Gp$%2eR zWKITwIooyfFky9B{L;rKo_;@$%uGgk%Bt zB+L=AYm1~`^n$CT;nn_~&bofovUl4{y+l%P-zmhMNCHyk@SJ`ItR79v8HN7ps$fP{ zDW0YgDNS{5?< z*XF(cCQk^+DYoV4Zg%o*~=jTJCGfJ%8FH4EI5WA+u4?YL@;s( zZu9ZQVk16I8jU1@PSW{amWbr#*B3S~F+U=m^;5i86XzzT8Eub8-@F}{ex$Z+bD;Y6B5M4%wG2!T zWA?@diQH0(3eQBe+40aS;K@?KHLiv7>cEyB27|Z2M1WPVgGBwTM}BY_PPkMBFRXHH z2HNAv^^46=omx6z{T93J}3EBR(lCD!Lw2^u66M7(k>Kg zA(!I)<>a8Jb&1niZ~>xBI4Arz&xd?oIP0w0Ka_gM&E9+v&KkEbj9e`hwx+NY{W5+O zx?5C35#s-%t~AKEj##5EHF^gfV3umuQID>!`R>|t)wG{!^D}hIJo;)Nz#`GTd90`XDha0svh^f#d*H^H8LU%&=&&$b z5zg;ShJray{_G~n)(#(8ZFbSqUFwIXTKup&iUB2Jm>ztg9Mo-ySxEs*a%SOB6!A#p z6RQ8s78mEXE{gt2hi1BCNdY=%4X4!AHT@?;xF4m}+4lSLdBuvu(JiA;=g`Y)c?=r3 z(>EO*hkUVQVJAzNUQpQ+>{Vz2B0p%ztxm|#@v2*Af0upror64hZngwAhAI{OBQD0# zbxKYbb|lTlb~=LRr4knAsEAd77sQ6^ zv@O1`Zzz_7jGxfbOd@!xsDyZg+{2z#ydQG(to^pF#GWdPHmX!IC%oskBChq}7h2;e(DOpKJUw{DYkmr= zP&f&e{%w*D;(Eyb@;ekBh?r|>s9%T4R%qsE&keOT(HOKCfX$>qJ-p=@?`~2A&%}h#qJp$PCnMG$ z#+neNQ7nT8P?R;kZYd%Zx9M}Z)f{!`Wy>zxpsE5*eI<}jwXECgJ@vA7pl^)x=nREF zYRbd?XEj)o+=QuYYe7h1l9?b)Z)8yo_Pgq&%ROGNHrXh|V)icKK=AjTKjs3BM|d4N z(y2>5Bg}?ayoAvf*GtmxPYm_8vn{Xng91V~_mC{|?(g8=AXd>fLd<_0k_{oi@c!aBP zK4|#YapoFV_NliMVNpqz*_+;v8y@~duipr+zm0?7e*yK~iyuN-cT8-gPi(?KWf_p$ zLqx$pC59CUcJVQ|Z5cZ((@!vS>~=wh&tYDi1&~Ii|N46X*)8FTk&TbmSSh zx9(hcDY$t&czB7o$PcONiX0&6n z3Y?T*N6EV9vyLuwRAIFREAS4^Adb-Q(mL<{7aO_ln0rxdIS&{uPw3p8V}x64&2zWo z^5l*7jf6E4(hlj9OB|mc^X!RKo8^6S1j(*kyi;j=m9oN>`fI8|K<(c+=4z^<>5KiA zCv5M|ZQ5}8!cToa0B!^0-YNa)`lndKd5zv2&Qq98Xd0qUG+26dmoqQEVR3%C2V7_J zT!2LY=G7PrMJ~zS8La#7L}!yOj(;B>JQ;B9$JJeO_Y9&??*sUGo?b(#4|7hzLQ-k^ z&)iUm;~<+p)>{yoH7*w1=0h5mW5yTQtLV31E3!AE5m@s#W;%tP!I1g{zQARzC_<*M zp9^kUdsS9^_Fv5SPXZ7$PNwJN6LBGbfETvyTK`3cP{~{rO!-e}`0B{T9XARg{;b|7 zgZE$jXG~`6VL}1KiAjc8XQH3m|EKG}JLLaY*H?aU|4o4$cOVe{wxEl>^n1bi>O^FI zS}1i~9$Q3e@9b$DV;Q7IIU#GZT@4-%S6AjD3B;kXL+c+hkZ*!bLw9OAIY($7Zn$xa6D_;qxADH@@A8nm4X z3I~E^h7TR3N6`pv2ZIe&Y;6Z%mm77-57Iy)>^08{gA0LK<(v6>v%j^PS zG9V3Bcfy$9H!hP2#8AQ{+?OrjrdMPo0e0pkz>D{EaIrS9cx||Ds~}%3@S;>m;*%fD zqXd*}MrU9ItlGHbs9qa*u875-mt>+62&+Fce!f1Hjti|zKXq6cc=0G@-DIjuYjFWEm90?)^9gWC&| z9~(RCEA!jQoS=RBg3aQ~0CCXC%LgkrpO-OWGndDpbWd|%r-E#1 zAXP7#PPX;iey2EJ>a~bFEYF#qI9~r=@BsmR9YJlZYN;X-mVYipe=k5c9zI_TDfKITM9R;_n(H=!Do^pEn@{<;pC~y6 zD;dW{@#59n5&x@b?Js(e^wJa3>6af`{+=(7R?$Fof3efH(&*RrYctjFA~DBl19#kj zT5Zk7$K;7t#m1A{LGPDNvHQ@RlwqHL@s0+KRC#Tb#bbzsCmg;b{_d}mq&eQ3&>2xc zkRe)7;%DmMteB{Dd$%v(`Cpf$(`~56XGQ%>7uiQ#9quChg=p?;^-R9OBE_S1Xk6XT z{A_n^#l+F^H^RW)1g>4dQQ#ejbD~Oml{=e>b zlhni?r|teyJBo^g^+?U=f0=uw{)8#st^y&LhjX20s`8Bl;uprRga~_!JH0b=KifU*$9-r9)1gxu($sw(uR&>&V@X zd^avr2;Y7A5*N;z&DRzC0Uq(1w@7U9318LPJ(c!)#TIr5$z`^B+U`%5J0ym7Zkta< zRlOcZ_hUbPV?Lpjo`3hfXQ706&Qzq=M9;R7s4Avc4Tj;+12VBMOP}M3xkL7q+`f&n zgf_Wrt0ba{^58}aJMni4)58yV2MRuiWNK@x) z*2l+yLZ0FXGY$Nl&V&oCO;1>VXDKdC5&@muvS$Cu{pL>yq0?um_I}gt6=Op-7*hys zHYIA(@&q!JShTrb66vP*Le%6PMERdG0ooEv1M@Bg76LU6@URo8a z^9U%H3l$N+0(~U@!{STWd8}uq4I0G=53}ACU7X8~rTbztk`hB$aO=%zk9m8#&*fPRI0V^{PqUVhv_fA*M_{VZQNp-)@+zH7J|qi(K{bpa|xXPX4j zD~=Ay1ZMa5Y#cPm>D%Nt_JYl;?^$1XPqIgUr_qlCA^`G8q}jpMYCXtI<)sd zoOEiEY_SNUyS1>}96WfN4R=o7EN7y0_{sP+RTob?havN?Hr(+i#=96z>Q8J0X@BBg zZOmqI6r_anaf>3U+s!ddklY55Sxbcbm!?9QeW~1feBwkEphMsUTit!A9g~ z`#ArB_Uv0DJ~1D@2bwhFG~uGfHsKCU)v4(~H1z$^So^l9Lmy!S=b|NxVwb;A7l!Mm zakGA)66S3ox~eG+_iT%e1Gd?OPls=~1G|HSnK|NcKutmC6+%TaU5C5NRXqdzCc+vu zdFmlrlqOp1!kd~rMa&o(U2M9AWBz^`!BWeha# zN{i;ht?%+yhmQ(^i&iH$MF;Wh@fE$&_mWR+$Tz4JypbsrX)9b&as+~QwAZ6FKf(wI zIRY=pz&nEw>|J8|HY|_#gp20ghATD@p=u7~@23kBYkrH)=EYEf1AA+DF0J-8#*)5)kjtIVlX+ilPp-0^ZMs64d=N#V0Fg_;aaj-(*YhJlGhvb#!&WstDb^i4d>A@XOfC zHmUQuz_Y@(bCnMkfcuUx^HJUD{+7XPfOm9-N?KyRt(!7cXqZ*%RT~^%^2WlTgNrFy z=uN<2vS-Q&7Z;lW9%6w=O3o?L$Vhas=P_r_amM`+`;WQx^EPvn()4%GCecS_(SVg+ z)D;9vj(>7J>5#r$jceHxI37||uF)ll=|Y)Zws6)jwpU>{0A=HZf@L)%D|Lw_g4QRBjb{^(9MJORIv^-W~9h(m9GEw#}7IipeI zUf)>8Q^L0+LZ|NOC8MDWS{IB>%=o-rgDHa5Pcw)i$_B(n&GlmSla)Yp`4A#%pZ_WA z4MK7=yGExF^9~~Gnb<1|sR2U`16Um+g`;u8fhc`p1$d5tTs$Goc&W$%+Kzf?(SvdX z0`w{M9#jyp;a>@A^>dKifoQ*`g6y!2)v?;GpdnYQ&MSD!F6c`|0%!52z+Yb~?u7{Q z6@%JQ(-+?~GMVa5F%)}q&L*W%!uS)Pm4!w-4S8Hz&S>6-wRE0|w+bywNn*|qE(JThwqB3~ z?*yvT9SMMW#aClCX!XpPw>zokNCt)r0^CZ%WUE^YC9EBatyJIA;{-blh7!NBKOcHp zE!HpWzG}|Er7))_101W5o`*Dpdbgl5GmCJN1_2?+r5*d~c>BP8P?8fc^kjh}=lyP!9u-H2A3T<#jtR00WE;4c@R;dLr|wyG$O+0P zh;M5LTVE!D_B6w?Sl8b9X-Ec~2t$wNf^JoOG|3EhpdIRYYj^gdP@XQW2BHmfg)w-( zExAJ;nX!@&(#;ZWY`;(7L5?iL*X2{;-BT{Av{m&z5^;Oh@wG1b7BCS}N#>-;AJvLA9w<-UHX%s~-pzJw(i|Do^M zIXlFgotpSwHv3jPs0chK^o*wmm;b zc}y>An|_Ez`CeRI^$^kg=#wmU;rpptr-!tx9LLYwN@Br9YYEyz3jK99J!qjBy*b5E^9YL(gbkz5VCp$>MjM%!iG+*^~T6MfHx947x9Z{%*z|WcpcZfwsfo<<&g<6=(`1ep zMZSF^@lu9I^mjB$HKZ~MjH0T1E~+29I;J6}tIXQI7tt*E9f?Gy1m$kHrEP2cg zR=zklZm=YD?scez3`25Nur(H|H+v+wWwp&_(cm(o zek&Mv7xO8_u@mz&_Srg8ynf^h4n& zNK$Sig-hEh0b$VJczL4#qV*zDH8sHDRdIg<=YU5_iqL|inv{~ zb9`;z_T(w%|LsV|8fKiq4Ws_iNz=US?UkJs!TX`d0V7lJ?OktzdHfbFPNdXTkmwlw z$RI183)=_(pO)X#Hk%^c?G8r^yXq?-HU%4vk&MGAV#vpsm>ycF62%quM0=x~bl{vL z@7~r&DoAk%l#FL02lvh09ms91XK_aiSvsFckd~fo&94u8d6W$FNX&*`c=}5}^ESU# zQ)a>W2a{=^6^%ag`!Qc-(&9tgM@U^9gOdxYG&y4$2{@7Nxvj`H0c7q9)!4o|Cq_;q zQB6O7kKKRj)Z1(DxbhK+1S}8j1oL3{Ht+Xjp$FAsk2L-KbGf6V^@K`C!QeLN()DQg znu6_s&<=>iAF~(BVRF4K9>%XWMc$k0ClT?h;6jP9sFotLFB<{D7BG*;LDa4)aBdx) zy_Y*1TzT!xtIESk@1UdYwGL!C5@(65CCQR=Ons%lKD@$zBENw}D{;3+o2pdc8Fe<5 z-9AdDi%V+ADN$A;$b73cEmwlh*||hF4HgUEkTS##F(m4XyL*p{uFYvoI%TJ56{9SCWf?u=jiurEWT zj+?QHB?K2B_MEXs{u5~1Xr*L{NMH&TjJkO9Ba?QM^>j3PtuOG~dVeBEs2+TG#E|Dw zWUZ_SOf=dqWj%yq)+vLKw^|D-UA4+rlZNZ^^SCJ7pWu7ViBDQxLzn_z;nLsjjWXhs zRud4ad;`p*bS&a%r!eM0AN9Mz)D`2nwrKeM=<(e$gT3)uWvExu01=8fk@onE~NUC zGB@Xj_hh4PSq+BVI$bzD3c_8&P$A$aWxAsAGPZnD*W1QQn`wukmqWA3a;7`kM4)}U zMg)>$yPQ9UQ47GI9EdjrhPs7i%UnY_s;O5yZ;1Ju%A3_(Xd5xQb*N{GW!Q*i_NVDT z$WXNLV^fDQ)2d)Qp8ecq>Uzg8#q;6*6qDC-C>OVv4urq#%Xl&4mHrqb%F2CG1cLx?#{RF)7rmxBxPxN+NpCZehi{9IkS#-X~SHXEigyZ z--3t?CVe38S9xtn014c^I6JK!M@V3*D>Q$Hav#t$!v=I77`Ko(NMSmIL+d;w_vvxq z$2?(_v*kFNGxW0;^`%h~5LNpp>G>|y8zwEk+0>_l(T49l5p*Rv2p2lQ*Ai_I?`H5j zml)YGYuQh7VyllB##iD&>`H9VhJHlnsTIq<%n)s%w_i|+Y=KZ`XI?(Q-iMzTQRKVI zKHlEq3b;$CRalAwDj+l_aH`}f)^pb=#}gr%@_ib!12@XrQgpDS zlTgAkSIRj_@8L*Z2}JtbAw(%s;EW_Z?l_AZGx08b0kt_jy8j*QJLh=4z1ripabl;e z!lfLX@TxH*?APme$6$7W%=-8=9jxz~Z$<{Kc}z~r>{|sX>CxRG#HIc(rU+j?_SR&m ze}nn8qm}1Ebp%AHhN>$?%WAbM`i0SHxmH(|oqF>*OdqUChp8rf_WS; zX1qlJagK4HqpB0*jtX$JhIVKOMj@g{R;e+&Q9Zu4V#pu6ES=gf@CqM{xR9WCTSRAE z0cc$+x(7w|s^iIyxl0;p&Ln`4k-)`Iv)#6qNqx3ik(K5NgVIeN){r^A$2JiG0=CFzioyvxMR=#|)%C^d- zmQC;UYjy?k*@3{ojTiN9wst1?`%cmav;1`t+Z>(RLUIVr-n&R}Q<7w6q|GQ9XZ|{W zsUQ1HFsobWY`dJ#%hVnWH(t{@$zT zpJGl+hmU&#LO))BF6=O}@9#$tRhPBVGEtlJ|K{_{dr!DgkmtdY&d^ZvbAE)32FHQy zunrWfAX+lkIsKagje}FR%!1FkWKTT1Q?(|r2wv@3qp+E@p|h+N9N}R0Rh|*}8gl`P z9zh|o-XOAcg+0PEb`6ID8C`Lod-F_b(#Mj~yG$`z;nwAiz3_gU(l#c;MZr$3Mr0QJ zL`qIhdDKAsEXp-)L1{a#-ExQCnI(xNx4S;3a;Ix)Uuu-94 zvQnP5ju~y2--q3(@9xbplHyT;!a@029=Jq)7nn>;Q^s#)n?u;uL&yb6!5Dh(7NZ7C zYrS8WRG*nuNOKaew2(M;?zdOg*M{;NmTTM=?4DlDzZWz+Hm4C@cSz4A1raA=MtbO> zW@sPQK%O4ZX)%r8S5ai_zAjr|JEhwW8Qfm>V zf5A$hh49nNO>HEvN>K|4?b(7hVVquHZNV_Ojsk|onJxyFuH}7YRURjR0F{dO=`jfF zHnlBBut+|U2nZg;t$Q^H%kx@~P=jJgBpAa^p!P(vE?Lil9u5pU$J^n;c$q8QothdPC%pSnLK4189L-)`wR!4UII< z;b9o8vQ~z?_uFSR)@KEL2b^UrxSsK>Td0`Sj}ILU>Wa@fYtE2sGavf+Q_JZEgiew_ zxXA!zwb8Hvl25p7gfs!Xg{V;FUcqV?h^?x@iiPY}xczZ2|F}rt@Enr>Cjs4Hmccyz zav|Y~J8q33+~m`AmBSgGqio!m*DlZVaq==!T5ajf6#di-(2>Ttl#q>@5iP=>QjBZl z2|P^G*Vi-ESowCLn&VbR$>&x%#(r{diZa3BMgLodbH<)CQ~NrPN)bLg>miS+WhL4o1jM;% zcWNv!0`>xcjX$wzT>UCk)i`JIK_TuB_t-@}zL6wI$n(fu3~Acna^29zX-ZHRVwSG1 z-19{!U_^%Xkc`qQkjZ#B`-B1#Z8Q5katKI;HR;ggE`A3`o8Z3_Y z)aGRQG}E=ZvbDIyNB=06zK6+yb)73NeTM)Ly!?7sTL_=isxEG|cTj)>;@os#?!w-Qo>AdaK3fm@JMd&`Jau0Mr69UCj$+9o}_DdhmRAzBEBo|fYw2KN>HILYtr_L*ucDLvgDx%U#yd@& z9qpCH(*!Ho1W>#qeoFL9(Fz2D;d+ZvJCCM+7a20V*fid^s@HHm`Pj$Uw3Y3Pgo|3; zkJrBl^7}dV6t=Oy(#7@+KC`s6C#9F1p9zxDtv+4~xZYuGJj9jIz4-l<5yK^T!Ksk_ z_|Bgmc}*o;*NyeMQ4~2rh5g-m3k6HdzmKJ*0Wc#o^asrM#^5>ML79!HetE#H>5zU_(Z+v0x?~?4OuHjG zIKmIz+WW068odelCwS_)wv;%cG1vZKBo)0!ZVb{vO)bp>aFap!R zxKUq(H8J0rAB#TH2#TG&BV?6Xl58RF)}}FR2xsuwbug=?M*e<*SL%-yywu)zP-8>7 z&Na0CF@W0h$#9Oir?40}XO*k92oFef_}9qVEYFBj+c2Kal~qp0BwI9@7Xxx|l$w2x z-wj|h+@YrBq2@H_vvYjG3CuDnC@}?QV}~X1ajRTmY$E`BHS^A~bjjNN?GsW`@q4iI5-%OUySkaE!T<&!ac;bvyz2pLXUOeVyA{wqt+SRYkY8 z4L5u&{kGiUU2V%X%S_C3zl;BM@ZkHXq3K~qM_iO(seMIdZR)n;!%D9j&dqubAN zuF?^ZHBR%pg}0F71tjxW%UmnbGz>(D*uz*|!8}^dE|2VwkLe+|)b_>;mrz1V6)i3M z%z!O%NmDjuHQ}0C_nu_W-A@0=5A{7&vgk#DiM)|n=gGjO%69h~is9@aF&emcPcLgO zrNO!Hrm9R$v=`Wv6VE9}%){XuAu}Bvd%L6`rskf*Yk)1kk^sh8K%K0gvD3P8!!Kv#^)>wV4^yvxaI#u+#7?(|+-L%eSOq@2_*ELl zseh#;Zol)Ie^m>B>pmY^6fIS7OzTD@Mc;HF{!`C*Tmekycp80AZ;>V2!Z!=Wf&@V(%cPOaM^$o2Jc8_?FhXlkZFK8McF0;lv*Pjp*kC^0xr zkWgJmNgLb1*ALj;{>R(NQ-BxmQigMnJx{a2zES@0ZB-P4lD-c3{W%@nx*cS^`;p;P z3bT{(uHRv0(+>&%->+64zn=Q|09p5eU9Fl{Krh_UVoCptp-RBU!L*sw8tq8X2JW1m zxMKtc%`FaI(~Hr?MPuiNl^tY`v>8~KFfkGl7B%}uq^@6&wyxrSt`Rb0eMTVg`*^6x z{5~9jSbbdf2^uJ0uBY(P7lnvz|G?r{0?cko_xe&3S3KKo_3 zN1;<88GBjaR4mV1_`$^Z^KVfHx}K?Lzi!{a%j^C1a4G+hclUWa=%;u{*Y2#OUf zj((u=G>?BBFog>P$Wso`ajnS0&(6@$L6sb$Pz-8Pe_#46_$RmMC zB$=l58~xI8rKh{*6m=qiCzxJppfws^#|!=C%U@Tav4!g zpgQL(CA&b~Qc4u`vbT<6ifx9YOAk)Pjt3MD`I`juTZzl2M0)lC z;_;pjQ3$LJ z84~n8h;{EUbkWD9Vt>1e3m~R7I~dSUhNO#agyx(<%Oo1|WzZZCP&0ZsFb`(y zB!4!rv1M=eS$m5N_j`FKEZs2T->pnwP>FhXxg2fCOIBiT<*!v9o3k+hz(|;cEmZA~ zJUQyc%Ge;qdDy$8y(j8uzN#%6Pl9t(7c+DFGoBbl=;m0&DYN(ET`PC(Y z$Y?rLq8wR8L{-V}v*O5j6lf?bsoj_S%KTAT$z$yv5r@v$EXlv+7=j}_IJHHS8sm-k77v_>nxBN|uX&DO$mXT4sz18 zp2yboL1t`ZK86#Cs*+~Jrq@84T!j%u5p!g!JM};675_6SQV3qg$BwmXvxyKg!PN>4zCKvbt@Z133zvMO)c+Rx7LruN zia^RJ>ysJ@3CA4Ch2!k2I{Tz8F7|N9#n4yJ_mVr)P0dR|<=yplOYOpB)xob`d7WX8 zgj++XevVM=>?gWR%d*ip#(OFJ+cT{`NK!#7$3twjjykq;LctiP7A(%p+;uCVLr`&r z%YyM6Ek$1nT$I*3YqHk7nOv4kb4AYa(C`K)eNB94>`xs>6!*kE8C*Q+tmPFcrt}40 z*Ol=>dklkJb3s$Xs1+MDxgv3Y<}6aEU?_RBV(H%&oE|`Z9GX#>>5lk)cw`feFX~n( z1njLp8@p^B?K3=+zEWGc{XyvO_CL9YT=Y2&klb@_IvUDcJk%TNcb9!KPHi6)zT0xT zXgsn`3EBA`ovbq6iE2A*yWRs*t|lYrY{;tv24}zP!Pd*Ek*gjvDx@*1aVlu>G`j7g zc}qGlFt9C~mK8bmm4-99APnJN2f#7WX;EqMT?C!Gm=(SXgPc)La_l2g3Ih|17~$0f zC)XZS=1+J9eq=R-UM-JVO;^4svtN!x=(_jOg&DF!-rK4vsC@|z=k^R=brwueWr2mr zmy9Lq&-;nJv3Ne2S~jcjvWfS z3V2}(9$j625HI+B<|>z#I8JKIk&ysxY|I9Z*DVgopRHDt(B3En6_!Kcy^3r^3&~s% zLLwJ;zP)DcNJwjNS@*T`*B0^(uJQY<_^NHMS?0{UpVsBoJ&+yJekoNAHIMLV zKggxoh#=k+bp%P;x=xL|IP)fjy53R$s7v-r)lBBvk@^fohI4VztobR4!7q%zjh8s{G`u) zc_pMT&xYi$Qpm2|&huIBd6t5X8v0L}3RqpDMH3~Y!{kS)CI0SaWep>|kiOdww`CU< zwB})^46D1CcF>&o417^1XI`OG030~;)x*C?g6OZU!f11>$b6?#sW*(sF;hr2jqe^^ zkvPazkGvOwWVXdB<|voF$nhMk9E+iX=o8iw_AGKiREdp842fn4bAP!P>$MudW!je7 zb8jEh=bB#SSypRqYAMjlXq+3;1w@+|tgQ+YP&!HL$WtGQ4X+0TU~hNG9e@J1F^Y&k z&3xXkeJ%iSD98;ssq6;fjzZAT(C0G5`e*(_Q_M;ZNgUlIqV#aQE`@8v;sx~m3oWfp z397?Ga-4cRgUNZp-eE{9fed$*HpuO%0o_u{&=sG~%XjwN?M^ym)KHPIS>4Q!t7w(? zdhciEwxE#~bN27JGjk`4O!b;|b{#~ldQgPHwa?#qgdi%y9kbvARkD*@N5cOzu?(wd z5b<0F%D%?27Z^P!&XkJ6EH|=pp}GQ&pceo>PnN5Y`{?-&!4EB7K0f)M`DNGuLbh94 zO}fC?UT{o2qVz2m1+D~ON0I-r(_JwL5I8FCZvJOeP}oWTGujP2Iv)WCcUsSm|2m|A zgC8oezrgX|1S-R0J>kT2L3QG`z;56SGYYeeM)W^> zXVJ8B-!!WzFCgM$;^(A>QlLQCS_j==(KKjNjyAmI#syTq?qqDP@vZYu zU{?UxebDb1C?G ziG2%#)g3+13NHpKpLYfB3EKfL)k$z+bt4b77>j|9uU%$xu=t# zD+1-zZ$O57yqx0b_ygWm7|Z z%bw8!)8O&pon|u7&O=Eg8X^CwxOo-5Ze*D$y+nWcxCm1ek>TCuLyqJbq6EJItdsAZPfdnNx8TVr|&H*!n`YXt zioxPxdY&KDU>?CgvcKFk(=v-f+~)A`jG}_j?CjjSX_k1B2No~&@qF(B^XNBa?73;? zP7?)GlY1R)L?Z@0Va_+YNo27hk@;IB)Ax{iV~vtGi-9aL=nXDq3;tU?Q4(B1() zq(QU6JY+YV^X*}E+X1gFe80Y%Zbl^xcHqz{I9H2I5b4|b!{DHobDJTGUv zfI6xr@g{y!phRBWBtqOY1gMn9Xn#NhN!@(_^Dw-0&h-F_+@Dbbz&Hzl@befnVXQ)T zCE1ZYi}I`J)fd$s0I)yns|kP6904HwP3F4*9$kA1a1Ol4A`#J^9kaMMmGZJT*#Qbb zNJuS!^iC~?0^dqL0EFN=(8$0mTJU;+?0^y=glLKfC}8&`1Cj=(@qiGT@)rQwe!}?w zRe|N=YjpJKzo z0EE$N8PlW#&u_;JC~s4XnA~f)~f`863P)CGm4qUbW5wZ<`w8nVVSb2$)kvfU#;svPvi=Q@f_>UV7#h)PYKc z@8(`2gZron+;nj#Xa|FLbV{NcDAkEsl8+!|k>oNntT}p>4Hl2f7BPtiH~DQz9e%n0 zsuASDX<^Ts&nLzFSQ6od>-2hK4k1baa6H_<&y!FO%o1hZ{#IXm zN$@Lm&~{c%+>SR2k@&%rhL8qQ_HCm`axnSvb)FSwwqf9{ndGnL+dPzz;;H>jfL<{@ z+tXe)G~+D>K=n^Y=qnZA3oct9?AC7TXP?H2n?!+|y0WT@Qh~FI`)lHJR^Z^UcTvLT z2JUb|Pe3=kjgt0$1m_ic{gG4I4Xq=-)fpf?8=sSp?QwAZUrcn{XCLi+y;0%02U)E0 z-U>B4I}a>*_G6du0n(}78DgIf7EjC@EIS)t^4~~yKGz9H+++g=Rka6JfWH2mD1aT` z#h|?bkS`b>B9T=`v6Jk`shRix>npw4_kSSpdo8R;p1c!o-A72h+06g-)zn<(AJRo> zB?TmP{K94%s0G{|xZzzi>F7ryRP6!;j-wE|o`pBmi~sx97QE3R)Sd0jg-QJSJOif3^83O^fYYpj)U)~Z+5e8C-n14}Rse8{ zM%!*Uz&8}ZKP1(EG>pHz^#7BFA%DY0`XD3#x&0r5>MsxdFPR<4oeN~53>+2yal8KU z(EpOz0iKfm@DK{;_CH?wUmp5jGCM$SAF>hFGk*7vm;SH7`VX1?CS`0S;3nMhABFZW zL+LM>9U!+O(qkv}9{l6U{s0vHz&{|8GOIT7zGf*0-$z zmvzfpkiH_{8#WN71cZL4M$gX%hB=2lwkv%|!Xd(MUW_ zv5g*)wgTfXh-(PV(k*>D1w4LN1{_^rErApGcvH^*(81H zi&~lrhK2RLEXhw3$^m~zD&$IyxTUAT$0nesVe{DsIZOO>h3WVH)3j(kHb!#`c3h!* zw3P_c2O!({nVNkuiv7G1BC&kIMYi(s2(n5(*47%!{BS;1UjT~8l-$Xw;-Fe&M@9FU z02KQw-bBX&DHubb)nodRljB@GluLiwpz1^D-q{lO>&{UcryZ9hYz8s7z z){uA6#HX zy&YsK+me5WfC_T~EQP#Y zL1{z}xK;sl!H=A)(Dtw9&n!uci%vsM%5zR$nG{`sI!N*x6Ir~XG?J-H!mcpQ=%hue zw5wy5+NWn;%>u0DuixM8iJt>yj#9K4_W>4Sf$-?Xq|20aG9H5N>tgo29nqXvvievg z+E7YX9-|VU77{5s=PVP>&&u7({$Z$)Jc;@jB(xdIud3M95;|9zS*o-#6M(IUW2bI@ zGy*8l{g~*zdGqzyCo;WHA=#@n^sZ-@pzKbrCC?%!>t_mPfO<5uV)o+Z*P<@ z>4klN9jI+XDI$7S?-<^vFzb2cmCP#&_Sk3x@}%j*Z^!}=lBi%#Kl{4$5#4}5T)PJL z98nwv*Oe;XipDC=WuonS7T8NAleU@UGJcvd=i~N$xV7@gOvcgwK{HgBeLG zru1lhvK*k>H3e1ce$s;fJ+VBfh-YzG{*=eqsJbztegur1?fDFz)d%b!w*TP}?kxJ- z(YWLaKP&jhKj~fN;=AOekro*v*7?|!`+wAO<^NE2|2rn5Fm|$U*>{FvrmSVjmNmPq zGuCV&OEM`WYsNZ5vhPbsin5K}*q0#@28GBLsi)7ar|0$k3%)x_xqgtT<4tY zx&UR*+b?mIk%q0^R-8OxO)WzCMIS$pyS|Z$3xmef2o<_XzVDEZQuo1`gIN4uh0@%` zTx4f{XsA_guhU`j!>B0)QQGZeIu>Y`tq1DI>RimqeEa0eMKwL=#rq#bdz@R?GqCmA zsgQ+U(M)e7k`7pC#jcp&129QaLnvRyBeOVD4=@32QKUS7dHm}J?vO07ZMLwlXOuF= zH-ff6!zQqs7(g#dD&nxpYoK|6|F!**-et6t*-$z2_+Wv?Q4bp1TZy2MZR-7P(2q>q zyGJf0mvcUOAFYPIauR9-=q08fOR2aa!_XpaA*-FeZP+du#?O>68ve`Z1v!9;A`?YrMNED3uS}VP1AKfIccg7@oc~ zl3vnU2_VC3dW=dv@{xVN4~+E0AFN+c-h8p9GFR^B=CH*#@JQ{mSHJFTf<%|m#mm%P zX{8210O$)Y+YNw7_7e>R+cj^ywp-ggR)Due=VO~5qc6-2@qk35RRp`xBj}q4@bDR_<+SI6m4A8Q? z)iJZeVH(8hz>UL;;W-% zzmwkbu~>{#0?81WZ(?VlFJku_Sx|!-`It0MpjqcVaiC`=pG8N+q0t0g`Z`2l`qxV!?E!$^Q+ziY`%&Bi|q#SMdzSmoh(YuLRaD^ zWVtzjQWKdD3Wbsxu)C)}6_1oEV~?7;X&Kkio&D^a545Jzt-IOo^?IcIgM~;N+y@-eL0T)b zu#uKe@gbqj%TtVT4J1C}fg6f-S5bqdiKa%?=%@xWOQoQb<*lME<4>eBRT`&OF(rOO zWh1qoAi3-fzkmra1rXl9=*eh+mc;>3DxYDbi5{Gpxc@7z^Lp@d@PFPxB5tu%GQei? z44HYrr>y~Zg@1?cf9mspOR9c`2fsARtz!VP@ZWLq7rg!Zj{f)$1==J9O$!k+qSeJj z&b){ISQq_YqWakgpCNcLYsOx2|I|e1FI8PV?7T? z0mxAI8JFQXBFOWmjEAEG#O_^0XhC+Nb1^#L?6&|k#*`xkT!cP5%vrFCt$>e5DH!Jh zr#)ZZTt5?txA&YmIaOVo;_^`EC^I_KklPEOi^x12UCv59{lYUzfe&JScEa;UI#nHr zu9E|b&ADl;r~@=yF#+tQ>@#)wfauvQpxMNrvYg8hUCw}o5ZxBCw`}SxBX-DSACXDK=)-Y0bs11&=;S25ha*Z65dS(2 zk-vT|a_6#NoR>-nntsq+PM2Z2alVh z0)=+{lBA83+0=C#2+FB8^wsihfs#79e6M-YjIjV&zi_%7&GLb?&<;M9oecE7cZnpS zQ%slshUL!n7VT^!2Uy`z94Pw2M#z;NKxu?6>&zr=i8d+CQ!J226vf`ZGSGhE{2Hs6 zIr@FR4`08hGUtcXQ9!n?L=Ss1LWqdFqbfDW#ELO;d6iAmqP+Z##diy5)c16A*k4^F zATnZfSA*l@uVXvbtF|YlY7yE4$ofcaYq-LY;oOp#yg1K($p_(g=WWPR9$i*MKtnf6 zG<=%n4j#I>?#!k!k7Mz!Hd@X*2f9y&QR)L}MB7AHbLDgwgKwt92|0?VN4||GFl6hR z$pzOVPM4JC53)rm$D8RxNwOB_-`+94a;UD-;8mdF#r=t!JaW|*nk_FB?4@IS(!njN zsI!Hbdsrh^$U~mRGdt93zO^YjSH{}K%i*r6Id3e6<*GWTMRA8Vrlegou}~#!&<=u% zM(YawShqtk`Qb-G3#0ujBv9WzbOgbX3RQvhj^>~642yycI|XGN9$5=3Z^bxkc2&^_ zT)anhD{!yNGD}rA(-`SO`N6T4`!$>Tvi+%&Kg38{08p`urmsQs4z9ts!$5$-kYdc zs!mFqQ67ZjpS05%x{cc-AqLiD_G^ACYV#$*({efUWs4SFw1bMDBKq}JVcI~Ha_gCB8HH{*SDRD4|{sf zmyksW%R$o+ifr;R!Db17${DNa5HcK`)M?G^yq^}F(pCUf+jzoAn6u%19`nP0dZ@AF z-bn|;C|8qG?ynA?C<+ee0+LSoBaB0<2oFtOqqHsF$REZAI+6j_aU`Nsc34tlABw{p z3pN;QPX6>wy1^K$t>VCgB13&+k%}%MdfoENKS{tZO)dNCm)C2!DqTU;j+^_!C_#!$ zleELw$JjR>8bMparvTuIS@^l@MH}N201Goayo6fw_N+L~``Tg6?1g;Do0_{toHV|Z zwB~3BPD{IEmwd{nB782yUEP~78$f{ZiVfg_ztS;#Y3-xiMZ92YUDnWvRwpd52^0Dj zGhlh}O0QbF&w4IQh&vHe0;IqSxV()G4+}Bv+%CCwV&ww!{qjO~j$-&!PH&J#EvK!+ zZWhqFivG$?Bq+a?7eT?xbMEur6+edwliq(;>g@wdaSLAd)^7c|qzjoYyVGXbArCez z*&Sx!VkxxSqCpLR9&$5XE*G=7+ZCfyd;XU@$yNEOWMk%V`+-6-A-IUfZWUH$3Yfn^ zc1HrydRQ?Z(XgiDpvRN5qFWp4#pNHp9g=@Q&s zCz2ad1ce;#{h7-D6*1XnNKZbWEYAAHKT02(f zw{vwVa7Hsmz{ipZl?qeXNS3i5UX=K!?ZL= zH_LmKzS8>p_SwIj=vBq@NQt!6x1W|HilyUw`?oSBM-?2JRpav*_WFPRdU<_Ily+92 zrt_L$#*U9%V=f=m2lYc~?q^hmokN3o0rlM&g8C`22#n3J*tJe;gw2`Q_t| zph3#(*3y{Cm%0xA!CX!2blcY4Ctb|d1*;8|izTm8{b$0w?Aw_9Y@JoFDD`}=DKP87 z@Z{LT>Ov4Vn#`BW!yo9r)q|1cc|7p5I3gD<`QI0P0U&asITt z6*o}TD4HkrspCrCNyDi1@eFO^l0b6T@?*N-+|sMxF3E&}BZ4tQ`&T8ig{%fPK$4Za zI{e?v-7FN6^A+BcH2CsL4`Qjs*d$1Bmv^RM;pSi3Zm&9jNt=MVoKD7CuPSLlFjh@h zE&4NS<9h3JAP3t8v*jyA8kufku}D5QBmAbmSUgpIv?qPC4&2(2539&}aqDh|{Xrgt zvyvH0mF#c;s`A>=iS^futR;(BJ92_e2pS|(*?q?y9@>=Zl&YJK z;}faB0j<3>W#G%J9IdIXgVI9=;H)ETTdQ*h^wYzF+=Riedu%T~x-N~aF9(}?6!B;C z_}DZK7PNJ-nyjn7zR4F@QQt?%U!bQUmIrfk@<_AM>Gss1u9BJd9}JzwFX(2C6HpCW z9eDLVo;F^Zm4u%Tpw?8`+Dnp9>Q-^(NwHS$T@Tv5vH;I$$yEjvz_NWa9o82TIw8_7 z>e=XjVH996q${1yj|c8*O~_u-h7JhwLYP#;-}yysV%u9fB!$J*8f%`MCbUO&mBs&K?v!vxbW-Odikv2QqL0WOuL zFCgvX8zP*SK>(RREa}*!v!LK|l)?*|Lca`au<#`O=rGe0@a- zrn)vS0T&DKk9V8H)-qCF>pyrX;_h%f5sx=G;O73x`Qa$Xibh~y9!k$GEJ`$RTupQ^ zSg^MVSDP~wJ2~~AUVoXiQm6FzloKTzZ8~7hRfPub`;-U)uds|}M_cp+aAR-ZoZT0H@&*kYh5ckLd0BT^qbZW@^NHAt*Dr~kHEG+lr2U@ zj|hu^)2gG1c#O&>r4sMsm{Ul>ktEf3M=h;tB!{3}IMwI2$~j?eHG++9dx^&S`ZJVX ze8XDzbrUqXSq67)X&#JR=g}dO&vSRuJD$oNU+UN{mP)*4Ye zA4D4>9c?3zg#wfseS)Ra<(@pMLVlTOU)ybK!cCiv2!p3ded=u3A#(~jG~L*3`WvZ$ zIZd^xYL*T~ex4ye_`n?GA)v)FD|k7L6y6KVKHruto=A=@$hpO@h`dApcK&3{?Vb-U zoCCil&x&VYY|C2qcKS10|5-9x@fqJRxX4VpGKteNm^jEdW`Qlvc*_J%sap*I2C-9@ z{vpz*b<4;f*Sd!idCo0nCMbCWv?}drAD;HZrEgGAH34?Z-z^_GbRX{dx3w%rrT_4S z8t%rx^sd>5hMZ@Me}<*C>w5xTCT%6!<;lggGXYm<-u;mSLn?H;Q)j_M4=*hVeNNgRkZg@3Z8FJ*T3Hk&}Uu zzAsZ$AKflyX1QBdF0hfg#vCVJ+C2s3jKdR&=55pQ4@H{9a#90c7?{l5btB}LeSY-3 zVU^n)qkLukoUNPvJy(6=f=iQ#r)09lu{UWbzl=C1@1b?247kxBXDIG0CIi-l<1fD{ Z$(iO>E@?EQ0ek6lH?)kd*JwIE{2ztiF(?24 -- 2.11.0
Qualifier Values -

Specifies resources based on the mobile country code (MCC), optionally followed by mobile -network code (MNC) - from the SIM in the device. For example, mcc310 is U.S. on any carrier, +

The mobile country code (MCC), optionally followed by mobile network code (MNC) + from the SIM card in the device. For example, mcc310 is U.S. on any carrier, mcc310-mnc004 is U.S. on Verizon, and mcc208-mnc00 is France on Orange.

-

If the device uses a radio connection (GSM phone), the MCC will come - from the SIM, and the MNC will come from the network to which the - device is attached.

-

You might sometimes use the MCC alone, for example to include country-specific legal -resources in your application, but if you only need to specify based on language, then use the -language and region qualifier below. If you decide to use the MCC and MNC qualifier, you -should do so with great care and completely test that it works as expected.

Language and region

This is defined by a two-letter

The language is defined by a two-letter ISO 639-1 language code, optionally followed by a two letter ISO - 3166-1-alpha-2 region code (preceded by lowercase "r"). + 3166-1-alpha-2 region code (preceded by lowercase "{@code r}").

The codes are not case-sensitive; the {@code r} prefix is used to distinguish the region portion. You cannot specify a region alone.

This can change during the life -of your application if the user changes their language in the system settings. See Handling Runtime Changes for information about how this can affect your application during runtime.

See Localization for a complete guide to localizing your application for other langauges.

+

Also see the {@link android.content.res.Configuration#locale} configuration field, which +indicates the current locale.

-
    -
  • Small screens are based on the space available on a - QVGA low density screen. Considering a portrait HVGA display, this has - the same available width but less height -- it is 3:4 vs. HVGA's +
      +
    • {@code small}: Screens based on the space available on a + low-density QVGA screen. Considering a portrait HVGA display, this has + the same available width but less height—it is 3:4 vs. HVGA's 2:3 aspect ratio. Examples are QVGA low density and VGA high density.
    • -
    • Normal screens are based on the traditional Android HVGA - medium density screen. A screen is considered to be normal if it is +
    • {@code normal}: Screens based on the traditional + medium-density HVGA screen. A screen is considered to be normal if it is at least this size (independent of density) and not larger. Examples of such screens a WQVGA low density, HVGA medium density, WVGA high density.
    • -
    • Large screens are based on the space available on a - VGA medium density screen. Such a screen has significantly more +
    • {@code large}: Screens based on the space available on a + medium-density VGA screen. Such a screen has significantly more available space in both width and height than an HVGA display. Examples are VGA and WVGA medium density screens.

    See Supporting Multiple Screens for more information.

    +

    Also see the {@link android.content.res.Configuration#screenLayout} configuration field, +which indicates whether the screen is small, normal, +or large.

-

This is based purely on the aspect ratio of the screen (a "long" screen is wider): -

    -
  • Long: WQVGA, WVGA, FWVGA
  • -
  • Not long: QVGA, HVGA, and VGA
  • +
      +
    • {@code long}: Long screens, such as WQVGA, WVGA, FWVGA
    • +
    • {@code notlong}: Not long screens, such as QVGA, HVGA, and VGA
    -

    This is not related to the screen orientation.

    +

    This is based purely on the aspect ratio of the screen (a "long" screen is wider). This +is not related to the screen orientation.

    +

    Also see the {@link android.content.res.Configuration#screenLayout} configuration field, +which indicates whether the screen is long.

-

Portrait orientation ({@code port}) is vertical and landscape orientation -({@code land}) is horizontal.

+
    +
  • {@code port}: Device is in portrait orientation (vertical)
  • +
  • {@code land}: Device is in landscape orientation (horizontal)
  • + +

This can change during the life of your application if the user rotates the screen. See Handling Runtime Changes for information about how this affects your application during runtime.

+

Also see the {@link android.content.res.Configuration#orientation} configuration field, +which indicates the current device orientation.

-

These configurations can be initiated when the device is placed in a dock.

+
    +
  • {@code car}: Device is in a car dock
  • +
  • {@code desk}: Device is in a desk dock
  • +

Added in API Level 8.

This can change during the life of your application if the user places the device in a -dock. See Handling Runtime Changes for -information about how this affects your application during runtime. Also see {@link -android.app.UiModeManager}.

+dock. You can eneable or disable this mode using {@link +android.app.UiModeManager}. See Handling Runtime Changes for +information about how this affects your application during runtime.

-

- These configurations can be initiated by the device light sensor (if available).

+
    +
  • {@code night}: Night time
  • +
  • {@code notnight}: Day time
  • +

Added in API Level 8.

-

This can change during the life of your application if the device determines that the -user environment is a "night" (dark) setting. See Handling Runtime -Changes for information about how this affects your application during runtime. You can -also explicitly set this mode using {@link android.app.UiModeManager}.

+

This can change during the life of your application if night mode is left in +auto mode (default), in which case the mode changes based on the time of day. You can eneable +or disable this mode using {@link android.app.UiModeManager}. See Handling Runtime Changes for information about how this affects your +application during runtime.

-

The medium - density of traditional HVGA screens (mdpi) is defined to be approximately - 160dpi; low density (ldpi) is 120, and high density (hdpi) is 240. There - is thus a 4:3 scaling factor between each density, so a 9x9 bitmap - in ldpi would be 12x12 in mdpi and 16x16 in hdpi. The special - nodpi density can be used with bitmap resources to prevent - them from being scaled at load time to match the device density. -

- When Android selects which resource files to use, - it handles screen density differently than the other qualifiers. +

    +
  • {@code ldpi}: Low-density screens; approximately 120dpi.
  • +
  • {@code mdpi}: Medium-density (on traditional HVGA) screens; approximately +160dpi.
  • +
  • {@code hdpi}: High-density screens; approximately 240dpi.
  • +
  • {@code nodpi}: This can be used for bitmap resources that you do not want to be scaled +to match the device density.
  • +
+

There is thus a 4:3 scaling factor between each density, so a 9x9 bitmap + in ldpi is 12x12 in mdpi and 16x16 in hdpi.

+

When Android selects which resource files to use, + it handles screen density differently than the other qualifiers. In step 1 of How Android finds the best matching directory (below), screen density is always considered to be a match. In step 4, if the qualifier being considered is screen - density, Android will select the best final match at that point, + density, Android selects the best final match at that point, without any need to move on to step 5.

See Supporting Multiple -Screens for more information.

+Screens for more information about how to handle screen sizes and how Android might scale +your bitmaps.

If the device has a resistive touch screen that's suited for use with a stylus, -then it may use the {@code stylus} resources.

+
+
    +
  • {@code notouch}: Device does not have a touchscreen.
  • +
  • {@code stylus}: Device has a resistive touchscreen that's suited for use with a +stylus.
  • +
  • {@code finger}: Device has a touchscreen.
  • +
+

Also see the {@link android.content.res.Configuration#touchscreen} configuration field, +which indicates the type of touchscreen on the device.

Keyboard availability keysexposed
- keyshidden
keyssoft
-

If your application has specific resources that should only be used with a soft keyboard, -use the keyssoft value. If you do not provide keyssoft resources, but do -provide keysexposed and keyshidden, and the device shows a soft keyboard, -the system will use keysexposed resources.

-

This can change during the life of your application if the user opens a keyboard. See Handling Runtime Changes for information about how this affects your -application during runtime.

+
    +
  • {@code keysexposed}: Device has a keyboard available. If the device has a +software keyboard enabled (which is likely), this may be used even when the hardware keyboard is +not exposed to the user, even if the device has no hardware keyboard. If no software +keyboard is provided or it's disabled, then this is only used when a hardware keyboard is +exposed.
  • +
  • {@code keyshidden}: Device has a hardware keyboard available but it is +hidden and the device does not have a software keyboard enabled.
  • +
  • {@code keyssoft}: Device has a software keyboard enabled, whether it's +visible or not.
  • +
+

If you provide keysexposed resources, but not keyssoft +resources, the system uses the keysexposed resources regardless of whether a +keyboard is visible, as long as the system has a software keyboard enabled.

+

This can change during the life of your application if the user opens a hardware +keyboard. See Handling Runtime Changes for information about how +this affects your application during runtime.

+

Also see the configuration fields {@link +android.content.res.Configuration#hardKeyboardHidden} and {@link +android.content.res.Configuration#keyboardHidden}, which indicate the visibility of a hardware +keyboard and and the visibility of any kind of keyboard (including software), respectively.

If the device has no hardware keys for text input, then it may use the {@code -nokeys} resources. Even if the device has a QWERTY keyboard but it is currently hidden, it may use -the {@code qwerty} resources.

+
    +
  • {@code nokeys}: Device has no hardware keys for text input.
  • +
  • {@code qwert}: Device has a hardware qwerty keyboard, whether it's visible to the user +or not.
  • +
  • {@code 12key}: Device has a hardware 12-key keyboard, whether it's visible to the user +or not.
  • +
+

Also see the {@link android.content.res.Configuration#keyboard} configuration field, +which indicates the primary text input method available.

+
Navigation key availability -

- If the device's navigation keys are currently available to - the user, it may use the {@code navexposed} resources; if they are not - available (such as behind a closed lid), it may use the {@code navhidden} resources.

+
    +
  • {@code navexposed}: Navigation keys are available to the user.
  • +
  • {@code navhidden}: Navigation keys are not available (such as behind a closed +lid).
  • +

This can change during the life of your application if the user reveals the navigation keys. See Handling Runtime Changes for information about how this affects your application during runtime.

+

Also see the {@link android.content.res.Configuration#navigationHidden} configuration +field, which indicates whether navigation keys are hidden.

If the device has no navigation facility other than using the touchscreen, then it -may use the {@code nonav} resources.

+
+
    +
  • {@code nonav}: Device has no navigation facility other than using the +touchscreen.
  • +
  • {@code dpad}: Device has a directional-pad (d-pad) for navigation.
  • +
  • {@code trackball}: Device has a trackball for navigation.
  • +
  • {@code wheel}: Device has a directional wheel(s) for navigation (uncommon).
  • +
+

Also see the {@link android.content.res.Configuration#navigation} configuration field, +which indicates the type of navigation method available.