安卓中每看到的一个界面,都是对应着一个activity。
导入源码包
onCreate是做初始化相关的操作。inflate叫填充,inflate叫打气。把UI界面填充进来。
void android.app.Activity.onCreate(Bundle savedInstanceState)Called when the activity is starting. This is where most initialization should go: calling setContentView(int) to inflate the activity's UI, using findViewById to programmatically interact with widgets in the UI, calling managedQuery(android.net.Uri, String[], String, String[], String) to retrieve cursors for data being displayed, etc. You can call finish from within this function, in which case onDestroy() will be immediately called without any of the rest of the activity lifecycle (onStart, onResume, onPause, etc) executing. Derived classes must call through to the super class's implementation of this method. If they do not, an exception will be thrown.Parameters:
Open Declaration void android.app.Activity.setContentView(int layoutResID)Set the activity content from a layout resource. The resource will be inflated, adding all top-level views to the activity.Parameters:layoutResID Resource ID to be inflated.See Also:setContentView(android.view.View)setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
setContentView(int layoutResID)接收一个参数,布局文件的资源ID.R.java就有一个静态内部类layout
public static final class layout { public static final int activity_main=0x7f030000; }
静态内部类layout的静态成员变量activity_main对应布局文件activity_main.xml.setContentView解析activity_main.xml这份XML文档。遇见RelativeLayout就把RelativeLayout对象创建出来,遇见TextView就把TextView对象创建出来。都创建出来之后整个界面就已经加载到内存里面了,加载进来就可以进行展示。
把activity的内容设置进来,从布局文件资源。这个资源会被填充进来,把这个东西加载到咱们的界面的最上面。通过 setContentView(R.layout.activity_main);加载界面。
R.layout就是在R这个文件找到layout这个静态内部类,然后找到activity_main这个资源ID.拿这个ID其实就是对应着我这份activity_main.xmlXML文档.
每当在res/layout上创建一个新的文档,它马上就会在我的R.class文件里面生成对应的内容。R.java它会自动为新的布局生成资源ID.通过这个资源ID就可以找到布局。
setContentView(R.layout.activity_main);把刚才写好的activity_main.xml就给它加载到内存当中。
获取控件的内容,首先要拿到这个控件。通过这个控件调相关的方法。通过这个方法咱们才能获取到里面的内容。点击这个按钮,我还得操作这个按钮,我既然想操作这个按钮所以说我还得找到这个按钮的java对象。我得找到这个输入块的对象,还得找到这一个按钮的对象。这两个对象都找到之后我才能进行下一步的操作。所以onCreate(savedInstanceState)做初始化的操作,第一步是加载界面,第二步是要找到要操作的控件。
布局里面每个控件都有一个属性叫做id。R.java也有一个静态内部类叫做id。在我的布局文件里声明一个id,就会在R.java这个文件的静态内部类id里面生成了这么一堆成员变量。
由于我在setContentView(R.layout.activity_main);的时候通过这个方法我这个对象实际上都已经创建进来了。这些东西已经都在内存里了。所以我通过这个id就可以找到我们已经创建好的这些java对象。
View是所有的安卓控件的爹,每一个安卓控件都是一个View对象,View是安卓控件的共同父类。
public class EditText extends TextView {
public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {
获取到控件之后要获取到电话这个输入块里面的内容。点击拨打此号码这个按钮的时候获取。点击这个按钮应该先获取用户的输入然后把这个号码发到打电话的应用上。通过打电话的应用把这个号码给它拨打出去。所以要给按钮添加点击事件。
package com.itheima.dailer;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity { //Activity 代表了一个用户的界面. 每一个android的界面都对应一个activity //activity可以创建一个窗口,在这个窗口上加载用户的界面(UI) 这个界面就是用来跟用户交互的 //Activity是安卓中最重要的API, @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //当activity创建的时候就会调用oncreate.在oncreate中做初始化的操作 // 首先调用setContentView()方法 加载界面 加载到内存 展示出来 setContentView(R.layout.activity_main); //找到要操作的控件对应的java对象 findViewById 这个方法的返回值 是view对象 //View 是所有android控件的父类 EditText et_number = (EditText) findViewById(R.id.editText1);//找到控件用到的API 通过id要找到view Button btn_call = (Button) findViewById(R.id.button1); //给按钮添加点击事件 btn_call.setOnClickListener(new MyonClickListener());//接收一个OnClickListener对象 } private class MyonClickListener implements OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub // 当控件被点击的时候就会调用这个onclick方法 // ① 获取用户的输入 // ② 判断用户输入是否为空 // 如果为空 提示用户 输入内容 // 如果不为空 用获取的电话号码 打电话 } } @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; }}