Android程序框架分析2
上一篇大概总结了目录结构中的R文件和AndroidManifest 文件,我们把目录结构再粘出来,看看布局文件和activity类,如何将布局XML转换成视图对象。目录结构如图1 所示。
图1.1 Android 目录结构
布局文件也就是用来设计用户界面的,放置在res/layout文件夹下,我这里的布局文件名为activity_main.xml(没有给大家显示出来,大家试试创建一个工程)。不过还是得要看看这个activity_main.xml 是如何使用XML代码来定义布局文件的。如代码清单1.1 所示。
代码清单1.1 默认的activity布局(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"
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="com.example.test.MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
你可以看到布局文件默认定义了2个组件:RelativeLayout 和TextView。组件是构成用户界面的模块,可以用来显示文字、图像或进行用户交互等,我们常见那些文本框、按钮、选择框都是组件。如图1.2 就是显示了activity_main.xml 布局文件,你可以看看RelativeLayout 和TextView是如何展示在屏幕上的。
图1.2 默认组件的显示
图1.2 中,白色的屏幕就是代码中RelativeLayout显示出来的,Hello World!也就是TextView组件设置的文字。
从代码清单1.1 可看出其 根元素是RelativeLayout组件,所以组件必须指出Android XML资源文件的命名空间属性为:xmlns:android=”http://schemas.android.com/apk/res/android”。而RelativeLayout组件是继承自View子类的ViewGroup组件,类似的还有FrameLayout、TableLayout、LinearLayout。此RelativeLayout组件还包含了一个子组件:TextView。
上面还包括了组件的一些常用属性,接下来我们可以看看。
android:layout_width和android:layout_height 属性
定义组件的宽和高,几乎每类组件都有这两个属性。
match_parent:视图大小与父视图相同(之前有一个fill_parent等同于match_parent,现在不用了)
wrap_content:视图大小根据其内容自动调节。android:paddingBottom,android:paddingLeft,android:paddingRight,android:paddingTop属性
定义的是布局里面的内容距 上下左右 边界的距离。如Hello World!这个TextView的显示,你可以看到距离上下左右的空白处- android:text属性
指定显示的文字内容,注意的是android:text不是直接写字符串字面值,而是引用字符串资源(即strings.xml,在里面定义字符串),你可以打开res/values文件夹中的strings.xml进行查看。如代码清单1.2 strings.xml的内容。
代码清单1.2 strings.xml的内容
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">AndroidTest</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
</resources>
使用 <string>
标签进行定义字符串,包括name为字符串的名称,以及添加字符串的文字内容。
了解完布局XML文件,接下来看看如何在应用中获取此界面。主要是通过Activity类进行获取。代码清单1.3 所示。
代码清单1.3 Activity活动的默认类文件(我这里的类文件为 MainActivity.java)
package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
此java类中包含3个方法,咱们先看onCreate(Bundle),其余两个先不看。activity子类的实例被创建后,onCreate(Bundle)方法会被调用,然后需要获取和管理自己的用户界面。使用语句为:setContentView(R.layout.activity_main); 括号中填写的是布局的ID资源参数。
在上一篇中,有讲到R文件的内容,当我们创建一个布局文件时,R文件中会自动生成该布局文件的ID号,则我们就可以使用 R.layout.布局名称 来引用,然后将可以生成布局视图,布局文件中的组件属性也随之完成实例化。