文档章节

Android关键资源详解

cubieboard
 cubieboard
发布于 2014/08/05 14:45
字数 2167
阅读 112
收藏 19

     Android层次结构中,资源扮演着重要的角色,资源是绑定到可执行程序的文件(例如音乐文件)或值(例如对话框标题)。常用的资源实例包括字符串、颜色、布局文件等。例如不需要将字符串硬编码到应用程序中,可以使用它们的ID,这种间接性使你无需要改变源代码就能够更改字符串资源的文本。

        Android中主要通过两种文件类型来支持资源:XML文件和原始文件(包括图像、音频和视频)。甚至在XML文件内部有时也能看到资源被定义为XML文件内部的值(如字符串),有时XML文件整体就是一个资源(如布局资源)。

        XML文件集中的另一个特征是可以找到两种文件类型:一种编译为二进制文件,另一种按照原样复制到设备。像字符串资源、位图资源等都是编译为二进制文件,然后再包含到可安装的包中,这些XML文件具有特定的格式,其中XML节点被转换为ID。如果将文件放到/res/raw/目录下,它们将不会编译为二进制格式,必须使用明确的流式传入的API来读取这些文件号,如音频和视频文件。

       Android常用的关键资源:

      1)字符串资源

       Android中运行在一个或多个XML资源文件中定义多个字符串,这些包含字符串定义的XML文件位于/res/values子目录下,XML文件的名称可以任意指定,常见为strings.xml。如下所示:

    <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
        <string name="app_name">第一个Android应用</string> 
        <string name="action_settings">Settings</string> 
        <string name="hello_world">Hello world!</string> 
    </resources> 

当创建或更新文件时Eclipse的ADT插件将根据这两个字符串为他们创建唯一的资源ID,在应用程序的根包R.java中,自动创建一个Java类。如下所示:

    public static final class R { 
            public static final class string { 
            public static final int action_settings=0x7f050001; 
            public static final int app_name=0x7f050000; 
            public static final int hello_world=0x7f050002; 
        } 
            .... 
    } 

注意R.java在根包中定义了一个顶级类:public static final class R,这这个外部类R中Android定义了一个内部类:public static final class string,R.java将此内部静态类创建为一个命名空间,以保持字符串资源ID。这样我们在代码中就可以通过这个字符串ID来引用字符串:R.string.hello_world 。

        Android还支持子XML元素,例如<b>、<i>、<string>节点下其他简单的文本格式HTML,在文本视图绘制之前可以使用这种复合HTML字符串来设置文本样式。



      2)字符串数组资源

        可以指定一个字符串数组作为/res/values子目录下所有文件中的资源,我们将使用一个名为string-array的XML节点,此节点是resources的子节点。如下所示:

    <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
        <string-array name="test_array"> 
            <item>one</item> 
            <item>two</item> 
            <item>three</item> 
            <item>four</item> 
        </string-array> 
        .... 
    </resources> 

        这样我们可以应用程序中通过:String strings[] = this.getResources().getStringArray(R.array.test_array)来访问它们。


        3)颜色资源

        与字符串资源一样,也可以使用引用标识符来间接引用颜色,这样Android能够本地化颜色。在资源文件colors.xml中定义了颜色后,就可以在Java代码中通过他们的ID来访问它们了。除此之外Android还在自己的资源文件中定义了一组基本颜色,这些ID也可通过Android的android.R.color命名控件访问。如下所示:

    <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
        <color name="red">#f00</color> 
        <color name="blue">#0000ff</color> 
        <color name="green">#f0f0</color> 
    </resources> 

在Java代码中访问:int mainBlackGroundColor = this.getResources().getColor(R.color.red);

        在视图定义中使用颜色:<TextView android:id="@+id/textView"  android:textColor = "@color/red" />



      4)尺寸资源

        像素、英寸和磅值等都是可以在XML布局或Java代码中使用的尺寸,可以使用这些尺寸资源来本地化Android UI和设置它的样式,无需更改源码,可以采用以下单位来指定尺寸:

       px      像素

       in       英寸

       mm   毫米

       pt      磅

       dp     与密度无关的像素基于160dpi屏幕

       sp     与比例无关的像素,支持用于调整大小,适合在字体中使用

        这些资源ID在R.demen.*中,文件中的XML节点为/resources/demen。如下所示:

    <resource> 
            <demen name="mysize_in_pixels">2px</demen> 
            <demen name="mysize_in_dp">5dp</demen> 
            <demen name="medium_size">100sp</demen> 
    </resource>                 

在Java代码使用尺寸资源: float dimen = this.getResources().getDimension(R.dimen.mysize_in_pixels);

        在清单文件中使用尺寸资源:android:textSize="@dimen/mediaum_size"



       5)图像资源

      Android会为/res/drawable子目录下的图像文件生成资源ID,支持的图像格式包括:git、jpg和png。此目录中的每个图像文件会根据其基本文件名生成一个唯一的ID。例如文件sample_image.jpg则生成的资源ID为R.drawable.sample_image。

        可以在XML视图定义中直接引用/res/drawable下的图像:android:background="@drawable/sample_image"

        也可以在Java代码中获取图像:

      BitmapDrawable d = this.getResources().getDrawable(R.drawable.sample_image);

      button.setBackgroundDrawanle( d );



      6)布局资源

        在Android中,屏幕的视图通常以资源的形式从XML文件中加载,这些XML文件称为布局资源。布局资源是Android的UI编程中使用最重要的一种资源。我们在/res/layout下新建一个main.xml布局资源文件时,自动会在R.layout中生成一个R.layout.main的ID来标示这个布局资源。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:paddingBottom="@dimen/activity_vertical_margin" 
        android:paddingLeft="@dimen/activity_horizontal_margin" 
        android:paddingRight="@dimen/activity_horizontal_margin" 
        android:paddingTop="@dimen/activity_vertical_margin" 
        tools:context=".MainActivity" > 
     
        <TextView 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:text="@string/hello_world" /> 
     
    </RelativeLayout> 

        在代码中我们可以使用布局文件:

    public class MainActivity extends Activity {         
             
    @Override 
            protected void onCreate(Bundle savedInstanceState) { 
                    super.onCreate(savedInstanceState); 
                    setContentView(R.layout.activity_main); 
                    TextView textView = (TextView)this.findViewById(R.id.textView); 
            } 
    } 



7)其他XML文件

        Android还允许将任意XML文件用作资源,此方法使用资源的优势延伸到了任意XML文件,首先它提供了一种快速方式来根据所生成的资源ID引用这些文件,其次该方法允许本地化这些资源XML文件。

        需要以此方式读取的XML文件存储在/res/xml子目录下,如图所示:

    <root> 
            <sub> 
                    Hello world from an sub element 
            </sub> 
    </root> 

        就像处理其他Android XML资源文件一样,Android将编译此XML文件,然后将其放入应用程序包中,如果需要解析这些文件,需要使用一个XmlPullParser实例。    代码清单给出了解析test.xml的具体实例:

    private String getEventsFromXmlFile(Activity activity) { 
            StringBuffer sb = new StringBuffer(); 
            XmlResourceParser xpp = activity.getResources().getXml(R.xml.test); 
            int eventType = xpp.next().getEventType(); 
            while(eventType != XmlParser.END_DOCUMENT) { 
                    if(eventType == XmlPullParser.START_DOCUMENT) { 
                            sb.append("Start document"); 
                    } else if(eventType == XmlPullParser.START_TAG) { 
                            sb.append("Start tag"+xpp.getName()); 
                    } else if(eventType == XmlPullParser.ENG_TAG) { 
                            sb.append("end tag" + xpp.getName()); 
                    } else if(eventType == XmlPullParser.TEXT) { 
                            sb.append("Text:"+ xpp.getText()); 
                    } 
                    eventType = xpp.next().getEventType(); 
            } 
            sb.append("End document"); 
            return sb.toString(); 
    } 



8)原始资源

        除了支持任意XML文件之外Android还支持使用原始文件,这些原始文件位于/res/raw下,包括音频、视频或文本文件等需要本地化或需要通过资源ID引用的原始文件资源。与/res/xml下的XML文件不同,这些都文件没有贬义,而是按照原样转移到应用程序包中,但是每个文件在R.java中都会生成一个标识符。

        代码清单给出了一个解析/res/raw/下的test.txt文本文件的实例:

    String getStringFromRawFile(Activity activity) { 
            InputStream is = activity.getResources().openRawResource(R.raw.test); 
            String myText = convertStreamToString(is); 
            is.close(); 
            return myText; 
    }         
     
    String convertStreamToString(InputStream is) { 
            ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
            int num = is.read(); 
             while( num != -1 ) { 
                    baos.write(num); 
                    num = is.read(); 
             } 
             return baos.toString(); 
    } 



        9)原始资产

        Android提供了一个/assets目录,可以将要包含在包中的文件放在这里,这个目录与/src具有相同的级别,也就是说它未包含在/res目录中,/asset中的文件不会在R.java中生成资源ID,必须制定文件路径才能读取它们。文件路径是以/asset开头的绝对路径,可以使用AssetManager类访问这些文件:

    String getStringFromAssetFile(Activity activity) { 
            AssetManager am = activity.getAssets(); 
            InputStream is = am.open("test.txt"); 
            String s = convertStreamToString(is); 
            is.close(); 
            reutn s; 
    } 

原文作者:showyou
原文链接:http://forum.cubietech.com/forum ... &extra=page%3D1

本文转载自:http://forum.cubietech.com/forum ... &extra=page%3D1​

cubieboard
粉丝 11
博文 64
码字总数 2651
作品 1
珠海
私信 提问
Android 性能优化:手把手教你优化Bitmap图片资源的使用

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的Bitmap 使用优化,希望你们会喜欢 目录 1. 优化原因 即 为什么要优化图片资源,具体如下图:

Carson_Ho
2018/04/24
0
0
Android Hybrid开发:这是一份详细 & 全面的WebView学习攻略

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

Carson_Ho
2018/06/19
0
0
详解Android中的四大组件之一:Activity详解

activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将处于栈顶的状态。 paused:暂停,处于失去焦点的时候,处于,可能是被如弹框一样遮盖,被通...

达叔小生
2018/08/07
0
0
MySQL数据库实操教程(31)——JDBC处理大数据

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/lfdfhl/article/details/99653910 自定义View系列教程00–推翻自己和...

谷哥的小弟
08/15
0
0
AndroidManifest.xml详解

我们在进行APP开发的时候都会遇到一个文件:AndroidManifest.xml。从刚开始进行Android开发,到现在已经过去了几个月,还是对这个文件一知半解,只知道它是配置用的。但是这文件里的东西具体...

闪电的蓝熊猫
2018/05/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

采坑指南——k8s域名解析coredns问题排查过程

正文 前几天,在ucloud上搭建的k8s集群(搭建教程后续会发出)。今天发现域名解析不了。 组件版本:k8s 1.15.0,coredns:1.3.1 过程是这样的: 首先用以下yaml文件创建了一个nginx服务 apiV...

码农实战
11分钟前
1
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第6题

choose three Which three statements are true about indexes and their administration in an Orade database? A) An INVISIBLE index is not maintained when Data Manipulation Language......

oschina_5359
13分钟前
1
0
阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布

导读:新版本主要有三大变化:同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新;带来了正式的 feature:G1ElasticHeap;发布了用户期待的 Windows 实验版本 Experimental Windows version。...

阿里巴巴云原生
19分钟前
1
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

xiangyunyan
22分钟前
3
0
js 让textarea的高度自适应父元素的高度

textarea按照普通元素设置height是没有作用的,可以这么来设置, 下面给上一段项目代码 JS代码: $.fn.extend({ txtaAutoHeight: function () { return this.each(function () {...

文文1
22分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部