这是一个系列,咱们将其命名为工具箱,若是你尚未看以前的文章:html
Android工具箱之Context解析android
Android工具箱之文件目录segmentfault
在Android开发中,几乎全部的事情就是资源,而定义资源是你在开发Android应用时,最重要的一环。动画
资源被用在不少地方,例如定义颜色,字符串,图片,布局,菜单等,这样定义的好处就是再也不进行硬编码。全部的东西都须要定义在你的资源文件中,而后其被app中的Java代码所引用。最简单且最经常使用的资源是Strings资源。ui
下列是Android中经常使用的资源:编码
Property动画 文件夹:animator 详情:xml文件定义Property动画
Tween动画 文件夹:anim 详情:xml文件定义Tween动画
Drawables 文件夹:drawable 详情:bitmap文件或者xml文件
Layout 文件夹:layout 详情:用来定义用户界面的xml文件
Menu 文件夹:menu 详情:用来定义action bar或者菜单
Values 文件夹:values 详情:用来定义strings或者dimens等的xml
完整的,你能够参照Providing a Resource guide。
对于你的应用的每一个文本(好比按钮的文本,或者textview的文本等),你应该首先在res/values/strings.xml文件中定义你的文本。每个文本都是一对键值对,举个例子,若是你想让你的按钮展现Submit文本,那么你须要在strings.xml文件中:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello!</string> <string name="submit_label">Submit</string> </resources>
如今若是我引用了资源文件submit_label,其对应的值Submit就会展示。最后,你能够建立多个资源文件针对不一样的国家和地区,或者不一样的设备。
如今咱们定义了咱们本身的字符串资源,咱们能够随时随地的访问它,不论在Java代码或者布局文件中。例如,在布局文件中,咱们简单的使用@来引用它。
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/submit_label" />
在你的Java代码中访问资源文件,你须要使用getResources.getString方法或者getString方法来经过其资源id获取其对应的值。
String submitText = getResources().getString(R.string.submit_label);
相同的方法也适用于图片或者颜色的获取, getResources()方法返回资源对象,该对象能够获取全部的资源,而每一个资源对应一个单独的文件夹。
在一些例子中,你可能想动态的获取资源。举个栗子:
public String getStringValue(String key) { // Retrieve the resource id String packageName = getBaseContext().getPackageName(); Resources resources = getBaseContext().getResources(); int stringId = resources.getIdentifier(key, "string", packageName); if (stringId == 0) { return null; } // Return the string value based on the res id return resources.getString(stringId); }
如今你能够直接获取资源啦:
public String myKey = "submit_label"; // Maps to R.string.submit_label public String myStringValue = getStringValue(myKey); // Returns string text
一样的id也可这么作:
// getViewById("tvTest"); public View getViewById(String id) { // Retrieve the resource id String packageName = getBaseContext().getPackageName(); Resources resources = getBaseContext().getResources(); int viewId = resources.getIdentifier(id, "id", packageName); if (viewId == 0) { return null; } // Return the string value based on the res id return findViewById(viewId); }
为了构建杰出的UI设计,Android开发者须要可以让本身的app更加普遍的使用在不一样的设备上。要这么作,咱们首先须要安装屏幕大小区分,app必须为不一样的屏幕设置不一样的资源文件。
资源的强大之处在于其可选择性,基于屏幕大小,分辨率,语言等,一般的资源选择有:
针对手机和平板的不一样布局文件。
针对不一样语言的string资源。
针对不一样屏幕分辨率的drawable资源。
针对不一样平台版本的style资源。
针对不一样屏幕方向的布局文件。
针对不一样的选择不一样的资源文件,咱们须要为其建立不一样的文件夹,举个栗子,当涉及多个屏幕的时候,咱们提供多个图片,那么对应的文件夹应该是res/drawable-hdpi, res/drawable-xhdpi,和res/drawable-xxhdpi,系统会根据手机的分辨率自动选择使用哪一张图片,对应的文件树:
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png
Android提供了多个修饰符,你能够针对一个文件夹添加多个修饰符。一般状况下:
语言区分:
语言区分:en, fr 语言选择
屏幕大小:sw480dp,sw600dp 屏幕的最小高度或者宽度
屏幕方向:port, land 屏幕处于竖直或者横屏状态
屏幕分辨率:hdpi, xhdpi 屏幕分辨率用于选择不一样图片
平台版本号:v7, v11, v21 平台版本一般用于styles
drawable-en-sw600dp-land 用于英语平板横屏模式。
一般可选择的资源被用来针对不一样设备,而布局文件也可有修饰符。举个栗子:
res/ layout/ activity_main.xml item_photo.xml layout-sw600dp/ activity_main.xml layout-sw600dp-land/ activity_main.xml layout-sw720dp/ activity_main.xml item_photo.xml
一般来说,手机在sw240和sw480之间。7寸平板为sw600,10寸为sw720。
下列为如何确保你的app可以在不一样屏幕上展示良好:
避免硬编码在你的代码里。
尽可能使用RelativeLayout和不要使用AbsoluteLayout。
使用wrap_content和match_parent或者dp。
在须要的适合提供可选择的布局和图片
http://developer.android.com/guide/topics/resources/string-resource.html
http://developer.android.com/guide/topics/resources/accessing-resources.html
http://mobile.tutsplus.com/tutorials/android/android-string/
http://developer.android.com/guide/topics/resources/providing-resources.html
http://developer.android.com/training/multiscreen/screendensities.html
http://www.evoketechnologies.com/blog/effective-ui-design-tips-android-devices/