首先我们会想,我们以前的HelloWorld, 都会有个main 函数的入口点, Android应用的入口在哪来呢?
src 下的FirstActivity.java? 貌似找不到任何熟悉的main函数的定义。
不用找了, Android应用里面并没有main函数。但是它确实有个入口:
在AndroidManifest.xml 我们看到这个activity节点
<activity android:name=".FirstActivity" android:label="@string/title_activity_first" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> intent-filter> activity>
在此前我们已经多次提到Activity,那啥事Activity呢?
我的理解是,Activity是一个容器组件,是一个承载界面,可以和用户进行交换的组件,有点类似PC上的window,但是不一样的是,通常一个Activity通常就占据了整个屏幕,而且当前只能有一个Activity与用户交互。
我们在代码src下添加了一个Activity后,必须同时在AndroidManifest.xml中声明整个activity,才是有效的。如果希望程序启动时,就打开你指定的Activity,则需要在那个activity节点当中加入
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> intent-filter>
现在我们来看看代码:FirstActivity.java
public class FirstActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.first, menu); return true; } }
我们看到这个类的特点:
我们已经知道res/layout下面是放置界面布局文件的,我们已经有一个first.xml在那里了,那么代码是怎么和这个界面layout布局文件关联起来的呢?
那是onCreate方法中这句话起的作用:
setContentView(R.layout.first);
当Android应用启动一个Activity时,首先会调用的是onCreate(Bundle savedInstanceState)方法,只有调用了setContentView()方法后,界面才会呈现出来
下面我们来看看layout文件:res/layout/first.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" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:padding="@dimen/padding_medium" android:text="@string/hello_world" tools:context=".FirstActivity" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:text="Click Me" /> RelativeLayout>
根节点是RelativeLayout, 它是相对布局,一种布局方式,别的布局方式还是有线性布局,帧布局等。
TextView 是文本控件,用于显示文本,不可输入,类似于Label
Button 按钮控件。
观察发现,他们都有这些xml属性:
android:id:控件的id,用于唯一确定控件。
android:layout_width,android:layout_height: 控件的宽高
id的写法一般是@+id/xxxxxx, 宽高的值可以为三种之一:wrap_content, fill_parent, match_parent.
wrap_content是指,在画控件时,根据控件的实际内容来动态确定大小。
fill_parent, match_parent实际上是一个意思,占满父容器的空间,区别只是match_parent是在Android2.2之后引进的。
android:text 是控件的文本内容,值可以直接填写,也可以引用values/strings.xml下的定义。例如
android:text="@string/hello_world" 就是引用了res/values/strings.xml下的:
<string name="hello_world">Hello world!string>