270 likes | 457 Views
Resources. Definition: A value or a file bound to an application. Binding to an application Create child directories under the res folder Store files or XML specifications in the child directories Examples Symbolic constants Icons, Pictures, audio, and video Drawable components
E N D
Resources Definition: A value or a file bound to an application • Binding to an application • Create child directories under the res folder • Store files or XML specifications in the child directories • Examples • Symbolic constants • Icons, Pictures, audio, and video • Drawable components • UI layouts • XML file specifications • Menus and Layouts
Naming Resource Subdirectories Syntax: <reservedName>[ [-<modifier>] … ]* • Parent Directory: res • Reserved Names: values, layout, drawable, xml, raw, anim • Modifiers: http://developer.android.com/guide/topics/resources/providing-resources.html • Platform versions: -v3, -v2, -v4, etc. • Navigation: -trackball, -wheel, -stylus, -finger, etc. • Keyboard: -12key, -querty, -nokeys • Screen density: -ldpi, -mdpi,-hdpi,-xdpi • Orientation: -land, -port • Screen size: -small, -normal, -large, -xlarge • Screen height or width: -w720dp, -h1024dp, etc. • Language and/or region: -en, -fr, -en-US, -fr, etc. • Examples (Note: for complex specifications, the order is important) • values-fr for Symbolic constants in french • layout-landscape • Complex resource specification: drawable-fr-land-xlarge-v4
Subdirectory Operation • Subdirectories with modifiers • Android first searches the least device-specific directory • Android then searches subdirectories that are more specific • Levels of subdirectories reflect combined device parameters • Subdirectories without modifiers • The default subdirectory has no modifiers (the default) • If a resource does not exist in a subdirectory with modifiers, Android looks for the resource in the default subdirectory • It is wise to always include a default, providing resources for the most common device configuration • Subdirectories with modifiers override the defaults • Runtime exceptions occur when resources cannot be found
Layouts (res/layout/main.xml) <?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" > <TextView android:id="@+id/note" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/ok" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/button_ok" /> </LinearLayout> fill_parent deprecated replaced with match_parent after version 2.0 + means create symbolic constant if not already defined Java access: setContentView(R.layout.main); // R.layout.file_name mText = (EditText) findViewById(R.id.note); // Get the widget
Symbolic Constants Defined with XML files in one of the res/values subdirectories • Purpose • Localize the values outside the source code • Enables easy changes without modifying code • Enables adaptations for different localities and configurations, without maintaining multiple loads • Examples • res/values-en contains strings in English; res/values-fr contains strings translated to French • res/values-sp contains color combinations that are appropriate to Spanish culture, like yellow for emphasis rather than red
Defining Symbolic Constants • How? Create XML files in the res/values subdirectories • Operation • Android gathers the XML files and merges their contents • Each build automatically generates the file R.java • Stored in a gen subdirectory (gen/com.example.android.notes) • Contains integer codes corresponding to each symbol • Application code addresses these codes using R.<type>.name • XML files references existing codes using @<type>/name • All modifier subfolders should use the same type and name values so the code device and location independent
String Constants • Typically defined in strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="menu_revert">Revert</string> <string name="resolve_edit">Edit note</string> <string name="title_edit">Edit note</string> </resources> • Access from Java code • setTitle(getResources().getText(R.string.title_edit)); • setTitle(activity.getResources().getString(R.string.title_edit)); • menu.add(0, REVERT_ID, 0, R.string.menu_revert) // group,id,order,text • Access from androidManifest.xml: <intent-filter android:label="@string/resolve_edit"> • Note:getString() returns a plain string, getText() can return a styled string Note: For some controls, getResources().getText() is not necessary
Arrays of Strings • String Arrays: strings.xml or any xml file name • Declaration:<string-array name="colors"> <item>red</item><item>green</item><item>blue</item></string-array> • Java: String[] = activity.getResources().getStringArray(R.array.colors); • Plurals: strings.xml or any xml file name • Declaration:<plurals name="group"><item quantity="1">one</item> <item quantity="2">couple</item> <item quantity="3">few</item> <item quantity="other">some</item></plurals> • Java: String s = activity.getResources().getQuantityString(R.plurals.group, 3);
Other Symbolic Constants • Colors: Typically colors.xml • Declaration: <color name="emphasize">#ff0000</color> • Java:activity.getResources.getColor(R.color.emphasize); • Dimensions: Typically dimens.xml; Units of measure are px, in, mm, pt, dp, sp • Declaration: <dimension name="border">5px</dimen> • Java:activity.getResources.getDimension(R.dimen.border); • Attributes: Typically attrs.xml; Customize the application based on parameters • Declaration: <declare-styleable name="styles"> <attr name="tiling"> <flag name="center" value="0"/><flag name="stretch" value="1"/> <flag name="repeat" value="2"/> </attr> • Java: String str = getString(R.styleable.styles.tiling, 2); // Get “repeat” Note: dp or sp = density independent or scale independent pixels
Color Drawable Resources • Declaration: Define in res/values with any xml file name <resources><drawable name="red_rect">#f00</drawable> </resources> • Access in XML <TextView android:layout_width="match_parent" layout_height="wrap_content" android:textAlign:center" android:background="@drawable/red_rect" /> • Java: label.setBackgroundResource(R.drawable.red_rect); Drawables can be bit map pictures: jpg, png, gif or shapes which are Series of rectangles, ovals and polygons, or various other visual effects
Drawable in the background myShape.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <gradient android:centerX="0.5" android:centerY="0.5" /> <solid android:color="#666666"/> <size android:width="120dp" android:height="120dp"/> </shape> Apply to layout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/myshape" android:orientation="vertical" >
Animations • Step 1: create an animation in XML • Step 2: load the animationa = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade); • Attach listeners to the animation if desireda.setAnimationListener(this); • Apply the animation to a view and starttext.startAnimation(a);
Animation Resources Create flashy animations on an Android device Purpose: vary scale factors, rotations, or colors from a starting to ending value over a period of time • Create an XML file in res/anim • Example: <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator"> <scale android:fromXScale="0" android:toXScale="1" android:fromYScale="0.1" android:toYScale="1.0" android:duration="5000" android:pivotX="50%" android:pivotY="50%” // Zoom from the center android:startOffset="1000" /></set> • Access from Java: R.anim.foo where foo.xml is the file in res/anim
Animation Example <?xml version="1.0" encoding="utf-8" ?> <set xmlns:android=http://schemas.android.com/apk/res/android android:interpolator = "@android:anim/accelerate_interpolator" > <rotate android:fromDegrees="0" android:toDegrees="160" android:pivotX= "50%" android:pivotY= "50%" android:startOffset= "500" android:duration="1000" /> <scale android:fromXScale= "1.0" android:toXScale="0" android:fromYScale= "1.0" android:toYScale= "0" android:pivotX= "50%" android:pivotY= "50%" android:startOffset = "500" android:duration= "500" /> <alpha android:fromAlpha=“1.0“ android:toAlpha="0" android:startOffset= "500" android:duration= "500" /> Accelerate interpolator: starts slowly and accelerates
Animation of List of Pictures Store in file named: android_anim.xml <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot= "false" > <item android:drawable="@drawable/pic1" android:duration="500“/> <item android:drawable="@drawable/pic1" android:duration="500“/> <item android:drawable="@drawable/pic1" android:duration="500“/> </animation-list> ImageView view = (ImageView)findViewById(R.id.IV_android); view.setBackgroundResource(R.drawable.android_anim); AnimationDrawable animation = (AnimationDrawable)androidIV.getBackground(); animation.start(); XML views are identified by an id value
Themes and Styles Definitions Style:A presentation format applied to either views, spannables or entire applications Spannable: A special type of string that can be styled within a view Theme: A style that applies to an entire activity or application
Style Definition Syntax <?xml version="1.0" encoding="utf-8"?><resources> <style name="style_name" parent="@[package:]style/style_to_inherit"> <item name="[package:]style_property_name"> style_value</item> … <item name="[package:]style_property_name"> style_value</item> </style></resources>
Defining a Style Resource • XML Definition (stored in res/values)<?xml version="1.0" encoding="utf-8"?><resources> <style name=“MyStyle" parent="@style/Text"> <item name="android:textSize">20sp</item> <item name="android:textColor">#008</item> </style></resources> • Usage in a view:<TextViewandroid:id="@+id/errorText" style="@style/MyStyle" /> • Activity theme: <activity android:theme=@style/MyStyle"> • Android Application theme: <application android:theme="@android:style/Theme.NoTitleBar">
Formatting and Styling • Formatting Strings (format is like using the C sprintf method)XML declaration: <string name="hi">Hello, %1$s!</string>Java usage: String text = String.format(context.getString(R.string.hi), user); • Styling a String XML declaration: <string name="bi"> <b><i>bold and italic</b></i> </string> Java usage: textView.setText(Html.fromHtml(R.string.bi), TextView.BufferType.SPANNABLE); • Styling part of a StringXML declaration: <string name=“ital">< i>Italics</i> to emphasize</string>Note: <b>, <i>, <u>, <sup>, <sub>, <strike>,<big>, <small>, <monospace> are ok Java usage: Spannable text = (Spannable)view.getText(); TextAppearanceSpan style = new TextAppearanceSpan(context, R.style, ital); text.setSpan(style, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); Note: applies style from characters 0 to 5 excluding end points
Applying a style to a view • XML declaration:<style name="highlight"> <item name="android:textColor">#ff0000</item> <item name="android:textStyle">bold</item> </style> • Java usage: textView.setTextAppearance(activity, R.style.highlight); • XML usage <EditTextandroid:id="@+id/myEditText“ android:layout_width="match_parent“android:layout_height="wrap_content" android:text="@android:string/httpErrorBadURL" android:style="@style/highlight“ android:textColor="?android:textColor" /> Notes +id/myEditText: Create id if not defined, @android:string/httpErrorBadURL: An android system message, ?android:textColor: Access the current theme’s text color
Refer to a Theme in an Application <manifest xmlns:android=http://schemas.android.com/apk/res/android package="com.myapp.themetest" android:versionCode="1" android:versionName="1.0" > <uses-sdkandroid:minSdkVersion="14" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.MyAppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Creating a Style Holo Dark <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="Theme.MyAppTheme" parent="android:style/Theme.Holo.Light"> // Inheritance <item name="android:actionBarStyle"> @style/Theme.MyAppTheme.ActionBar</item> </style> <style name="Theme.MyAppTheme.ActionBar" parent="android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">#FF4444</item> </style> // Change color of action bar Holo Light
A popup menu in XML (popup.xml in res/menu folder) <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/refresh" android:title="@string/refresh" /> <item android:id="@+id/settings" android:title="@string/settings" /> </menu> public void CreatePopupMenu(View v) { PopupMenu menu = new PopupMenu(this, v); MenuInflaterinflater = mypopupmenu.getMenuInflater(); inflater.inflate(R.menu.popup, menu.getMenu()); menu.show(); }
Respond to popup menu @Override public booleanonMenuItemClick(MenuItem arg0) { switch (arg0.getItemId()) { case R.id.refresh: showToast(getText(R.string.refresh)); return true; case R.id.option2: showToast(getText(R.string.settings)); return true; default: return super.onContextItemSelected(arg0); }
Many Resources <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">To Do List</string> <plurals name="androidPlural"> <item quantity="one">One android</item> <item quantity="other">%d androids</item> </plurals> <color name="app_background">#FF0000FF</color> <color name= "app_foreground“>#FFFF”</color> <dimen name="default_border">5dp</dimen> <string-array name="string_array"> <item>Item 1</item> <item>Item 2</item> <item>Item 3</item> </string-array> <array name="integer_array"> <item>3</item><item>2</item><item>1</item> </array> <dimen name="standard_border">5dp</dimen> </resources> Best Practice: put resource categories in their own individual files
File Resources • Images: Drop in a res/drawable subfolder; Codecs: jpg, gif, png • XML files to parse: Drop in a res/xml subfolder • Arbitrary files:Drop in a res/raw subfolder or /assets • Most files are pre-compiled during the build. These files are not • res/raw files have an R.java ID. For example R.raw.foo without an extension for foo.png or foo.txt. This approach requires lower case alphanumeric characters and periods.getResources().openRawResource(R.raw.myfilename). • Files stored in /assets do not have an R.java ID. Access using Java input stream programming using a fully qualified path name.InputStream is = getAssets().open("myFolder/somefile.txt"); • Examples of use: Video files or XML files that the application parses using Java DOM or SAX classes
Third Presentation Implementation of the class project • Describe how it works and give a demo • Use an actual device if possible • Specifically discuss innovations that you implemented • Discuss possible improvements that focus on making the application more exciting for users. • Discuss the advantages or disadvantages of using JavaScript or native Android applications, your preferences, and the reasoning behind your position.