工程相关解析

  有许多东西用来构建一个优秀的Android应用程序。除了应用程序的编码,你需要关注各种各样的资源,诸如用到的各种静态内容(位图、颜色、布局定义、用户界面字符串、动画)。这些资源一般放置在项目的res/下独立子目录中。

在eclipse中组织资源

  你需要将每种资源放置在项目中res/目录的特定子目录下。例如这是一个简单项目的文件层级:

MyProject/
    src/
        MyActivity.java
    res/
        drawable/
            icon.png
        layout/
            activity_main.xml
            info.xml
        values/
        strings.xml

res/目录在各种子目录中包含了所有的资源,这里有一个图片资源,两个布局资源和一个字符串资源文件。下表详细地给出了在项目中res/目录里面支持的资源:

目录资源类型
anim定义动画属性的XML文件,它们被保存在res/anim/文件夹下,通过R.anim类访问
color定义颜色状态列表的XML文件,它们被保存在res/color/文件夹下,通过R.color类访问
drawable图片文件,如.png.jpg.gif或者XML文件,被编译为位图、状态列表、形状、动画图片。它们被保存在res/drawable/文件夹下,通过R.drawable类访问
layout定义用户界面布局的XML文件,它们被保存在res/layout/文件夹下,通过R.layout类访问
menu定义应用程序菜单的XML文件,如选项菜单、上下文菜单、子菜单等。它们被保存在res/menu/文件夹下,通过R.menu类访问
raw任意的文件以它们的原始形式保存。需要根据名为R.raw.filename的资源ID,通过调用Resource.openRawResource来打开raw文件
values包含简单值(如字符串、整数、颜色等)的XML文件。这里有一些文件夹下的资源命名规范:arrays.xml代表数组资源,通过R.array类访问;integers.xml代表整数资源,通过R.integer类访问;bools.xml代表布尔值资源,通过R.bool类访问;colors.xml代表颜色资源,通过R.color类访问;dimens.xml代表维度值,通过R.dimen类访问;strings.xml代表字符串资源,通过R.string类访问;styles.xml代表样式资源,通过R.style类访问
xml可以通过调用Resources.getXML来在运行时读取任意的XML文件。可以在这里保存运行时使用的各种配置文件

替代资源

  该机制可以让app为不同的屏幕分辨率提供替代的图片资源,或者为不同的语言提供替代的字符串资源。在运行时,Android检测当前设备配置,并为应用程序加载合适的资源。
  要为特定的配置的确定一系列替代资源,需要遵循如下的步骤:

  1. res/下创建一个新的目录,以<resource_name>_<config_qualifier>的方式命名。这里的resources_name是上表中提到的任意资源,如布局、图片等;qualifier将确定个性的配置使用哪些资源。你可以查看官方文档来了解不同类型资源的一个完整qualifier列表。
  2. 在这个目录中保存相应的的替代资源,例如为高分辨率的屏幕准备高分辨率的图片。

  下面的例子指定默认屏幕的图片和高分辨率的替代图片:

MyProject/
    src/
    main/
    java/
        MyActivity.java
    res/
        drawable/
            icon.png
            background.png
        drawable-hdpi/
            icon.png
            background.png
        layout/
            activity_main.xml
            info.xml
        values/
            strings.xml

下面的例子指定默认语言的布局和阿拉伯语言的替代布局:

MyProject/
    src/
    main/
    java/
        MyActivity.java
    res/
        drawable/
            icon.png
            background.png
        drawable-hdpi/
            icon.png
            background.png
        layout/
            activity_main.xml
            info.xml
        layout-ar/
            main.xml
        values/
            strings.xml

访问资源

  在应用程序开发中,需要访问定义好的资源,不论是通过代码还是通过XML文件。下面的章节介绍如何分别在这两种场景中访问资源。

在代码访问资源

  当Android应用程序被编译时,它生成一个R类,其中包含了所有res/目录下资源的ID。你可以使用R类通过子类加上资源名,或者直接使用资源ID来访问资源。
  如果访问res/drawable/myimage.png,并将其设置到ImageView上,你将使用以下代码:

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

这里第一行代码用R.id.myimageview来在布局文件中获取定义为myimageviewImageView,第二行用R.drawable.myimage来获取在res/drawable子目录下名为myimage的图片。
  假设res/values/strings.xml有如下定义:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello, World!</string>
</resources>

现在你可以在IDmsgTextView对象上使用资源ID来设置文本:

TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);

  考虑如下定义的布局res/layout/activity_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/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello, I am a TextView" />
    <Button android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello, I am a Button" />
</LinearLayout>

这个应用程序代码将为活动加载这个布局,onCreate方法中如下:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
}

在XML中访问

  考虑下面的XML资源文件res/values/strings.xml,其中包含一个颜色资源和一个字符串资源:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="opaque_red">#f00</color>
    <string name="hello">Hello!</string>
</resources>

现在你可以在下面的布局文件中使用这些资源来设置文本颜色和文本内容:

<?xml version="1.0" encoding="utf-8"?>
<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" />

深入了解三个文件

  接下来我们就要剖析工程里三个比较重要的文件:MainActivity.java,布局文件activity_mainAndroid配置文件AndroidManifest.xml

MainActivity.java

  代码如下:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

在这里插入图片描述
R.layout.activity_main引用res/layout目录下的activity_main.xml文件。onCreate是活动被加载之后众多被调用的方法之一。

activity_main.xml

  代码如下:

<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"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
</RelativeLayout>

在这里插入图片描述
Android的控件使用TextView来构建用户图形界面,它包含有许多不同的属性,诸如android:layout_widthandroid:layout_height设置它的宽度和高度等。@string指的是res/values文件夹下的strings.xml文件,因此@string/hello_world指的是定义在strings.xml中的名为hello的字符串Hello World!

AndroidManifest.xml

  代码如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworld"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="22" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <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>

在这里插入图片描述
  该文件中显式地声明程序需要的权限,防止app错误地使用服务,不恰当地访问资源,最终提高android应用程序的健壮性。android.permission.SEND_SMS这句话表示app需要使用发送信息的权限,安装的时候就会提示用户,相关权限可以在sdk参考手册查找。
  无论你开发什么组件用作应用程序中的一部分,都需要在AndroidManifest.xml文件中声明所有的组件。这个文件是Android操作系统与你的应用程序之间的接口,因此如果没有在这个文件中声明你的组件,将无法被操作系统所识别。
  application标签之间是应用程序相关的组件。andnroid:icon属性指出位于res/drawable-hdpi下面的应用程序图标,这个应用使用drawable文件夹下名为ic_launcher.png的图片。
  activity标签用于指定一个活动,android:name属性指定一个Activity类子类的全名,android:label属性指定用于活动名称的字符串,可以使用标签来指定多个活动。
  意图过滤器(intent-filter)的action被命名为android.intent.action.MAIN,表明这个活动被用做应用程序的入口。意图过滤器的category被命名为android.intent.category.LAUNCHER,表明应用程序可以通过设备启动器的图标来启动。
  @string指的是strings.xml,因此@string/app_name指的是定义在strings.xml中的app_name,实际为Hello World

Strings文件

  strings.xml文件在res/value文件夹下,它包含应用程序使用到的所有文本,例如按钮或标签的名称、默认文本以及其他相似的strings。一个默认的strings文件看起来如下:

<resources>
    <string name="app_name">HelloWorld</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">MainActivity</string>
</resources>

R文件

  R.java文件是活动的Java文件(例如MainActivity.java)和资源(例如strings.xml)之间的胶水。这是一个自动生成的文件,不要修改R.java文件的内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值