自从写了第一篇之后,我一直在考虑第二篇该如何写,要是像书本一样一个个介绍下去甚是无味也没这个精力,所以再三思索决定第二篇写个快速入门,让初学者可以迅速上手Android(当然你必须有一定的JAVA基础),然后从下一篇开始就写实际开发中遇到的问题以及一些API的使用方法。言归正传,下面我们就开始今天的介绍:
打开你的Eclipse,点击File--->New--->Android Project,出现如下界面,我们将项目名叫做:CnBlog:
点击Next,出现如下界面,这里用来选择我们使用的Android版本,这里说下,你所选择的版本决定了你所支持的最低Android ROM的版本,也决定了你可以使用的方法,比如在2.3中出现的新方法,你选择了1.6是无法使用的,如何选择版本取决于你项目的要求,博主选择2.1,因为这可以兼容主流的Android手机。
选择好之后点击Next,会出现如下页面,这里你可以设置你的包名,我们就设为com.cnblog.activity,让Eclipse自动为我们建一个Activity,我们就不改了,命名为CnBlogActivity,当然你可以改为自己的名字,一般我们都使用某个具有一定意义的单词加Activity结尾。Application Name就是你创建程序后显示的应用程序名。
设好之后就可以点击完成了,你就可以在Eclipse中看到我们新建的项目:
在上图我们可以看到一个Android项目的基本结构,src里面存放着我们的源代码,gen中我们可以看到一个R.java的java文件,这个文件是Eclipse给我们自动产生,此文件不需要开发者自行维护。往下看,我们可以看到res资源文件夹,里面有好多的文件夹,以drawable开头的是用来存放图片文件的,后面的h,l,m我想大家猜猜也知道,是用来区分不同分别率的。再看layout文件夹,这里面主要用来存放布局文件,而values文件夹主要用来存放一些常量文件,比如颜色常量和字符串常量。再往下看我们可以看到AndroidManifest.xml,他存储了应用程序的组件和节点,我们写好的Actvity,Service都需要在这里面配置,运行时才可以调用。
好,下面我们就开始我们第一个项目,启动界面网络检测+调用系统拨号程序:
首先我们来设计一下启动界面的布局:此处采用的是线性布局,里面有一个ImageView控件和一个TextView控件,至于这些标签的意思我就不再一一细说了,网上这些方面的讲解铺天盖地。
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <ImageView
8 android:layout_width="fill_parent"
9 android:layout_height="fill_parent"
10 android:scaleType="fitXY"
11 android:src="@drawable/welcome_logo" />
12
13 <TextView
14 android:id="@+id/welcome_textview"
15 android:layout_width="wrap_content"
16 android:layout_height="wrap_content"
17 android:layout_gravity="center_horizontal"
18 android:layout_marginTop="-120.0dip"
19 android:text="@string/welcome"
20 android:textColor="@color/white"
21 android:textSize="22.0dip" />
22
23 </LinearLayout>
布局完之后我们就可以在我们的CnBlogActivity里面来进行逻辑操作了:
1 package com.cnblog.activity;
2
3 import android.app.Activity;
4 import android.app.AlertDialog;
5 import android.app.Dialog;
6 import android.content.DialogInterface;
7 import android.content.DialogInterface.OnClickListener;
8 import android.content.Intent;
9 import android.os.Bundle;
10 import android.os.Handler;
11 import android.provider.Settings;
12 import android.widget.TextView;
13
14 import com.cnblog.utils.ProNetworkManager;
15
16 public class CnBlogActivity extends Activity {
17 private Handler mHandler;
18 private TextView welcomeTextView;
19
20 @Override
21 public void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 // 设置Activity的布局
24 setContentView(R.layout.main);
25 // 初始化变量
26 mHandler = new Handler();
27 welcomeTextView = (TextView) findViewById(R.id.welcome_textview);
28 // 网络检测
29 networkCheck();
30 }
31
32 private void networkCheck() {
33 new Thread(new Runnable() {
34 @Override
35 public void run() {
36 // 休眠500毫秒
37 try {
38 Thread.sleep(500);
39 } catch (InterruptedException e) {
40 e.printStackTrace();
41 }
42 mHandler.post(new Runnable() {
43 @Override
44 public void run() {
45 welcomeTextView.setText("正在检测网络......");
46 if (ProNetworkManager.IsExistNet(CnBlogActivity.this)) {
47 access();
48 } else {
49 postDialog();
50 }
51 }
52 });
53 }
54 }).start();
55 }
56
57 // 进入主界面
58 private void access() {
59 Runnable mDelay = new Runnable() {
60 @Override
61 public void run() {
62 startActivity(new Intent(CnBlogActivity.this,
63 HomeActivity.class));
64 finish();
65 }
66 };
67 mHandler.postDelayed(mDelay, 1000);
68 }
69
70 // 设置网络提示框
71 private void postDialog() {
72 mHandler.post(new Runnable() {
73 @Override
74 public void run() {
75 Dialog dialog = new AlertDialog.Builder(CnBlogActivity.this)
76 .setTitle("注意").setMessage("检测到当前无网络连接,是否进行设置")
77 .setPositiveButton("设置", new OnClickListener() {
78 @Override
79 public void onClick(DialogInterface dialog,
80 int which) {
81 startActivity(new Intent(
82 Settings.ACTION_WIRELESS_SETTINGS));
83 finish();
84 }
85 }).create();
86 dialog.show();
87 }
88 });
89 }
90
91 }
这个里面涉及到了判断网络的操作,所以我们要在Mainifest文件中添加权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />至于上段代码中涉及到的一些Android API我在这儿就不细讲了,后面有机会会再讲。
好了,下面我们就来写我们的主界面,拨号程序,我们还是从布局文件开始写:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <TextView
8 android:layout_width="fill_parent"
9 android:layout_height="wrap_content"
10 android:text="@string/phone_num_attention"
11 />
12
13 <EditText
14 android:id="@+id/phonenumber_text"
15 android:layout_width="fill_parent"
16 android:layout_height="wrap_content"
17 android:hint="@string/phone_num_attention"
18 />
19
20 <Button
21 android:id="@+id/submit_button"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:layout_gravity="right"
25 android:text="@string/phone_num_submit"
26 />
27
28 </LinearLayout>
很简单的三个组件,文本,编辑框和按钮。好了,在创建一个Activity吧,我把它命名为HomeActivity,注意在Mainifest文件中配置:
1 package com.cnblog.activity;
2
3 import java.util.regex.Matcher;
4 import java.util.regex.Pattern;
5
6 import android.app.Activity;
7 import android.content.Intent;
8 import android.net.Uri;
9 import android.os.Bundle;
10 import android.os.Handler;
11 import android.view.Gravity;
12 import android.view.View;
13 import android.view.View.OnClickListener;
14 import android.view.Window;
15 import android.widget.Button;
16 import android.widget.EditText;
17 import android.widget.Toast;
18
19 public class HomeActivity extends Activity {
20 private EditText phoneNumEditText;
21 private Button phoneNumSubmitbButton;
22 private Handler mHandler;
23
24 @Override
25 protected void onCreate(Bundle savedInstanceState) {
26 requestWindowFeature(Window.FEATURE_NO_TITLE);
27 setContentView(R.layout.home_activity);
28 super.onCreate(savedInstanceState);
29 mHandler = new Handler();
30 phoneNumEditText = (EditText) findViewById(R.id.phonenumber_text);
31 phoneNumSubmitbButton = (Button) findViewById(R.id.submit_button);
32 phoneNumSubmitbButton.setOnClickListener(new OnClickListener() {
33 @Override
34 public void onClick(View v) {
35 String number = phoneNumEditText.getText().toString();
36 if (number == null || number.equals("")) {
37 postTip("请输入电话号码!");
38 } else if (!checkPhone(number)) {
39 postTip("请输入正确的电话号码!");
40 } else {
41 Intent intent = new Intent(Intent.ACTION_DIAL, Uri
42 .parse("tel:" + number));
43 startActivity(intent);
44 finish();
45 }
46 }
47 });
48 }
49
50 private void postTip(final String message) {
51 mHandler.post(new Runnable() {
52 @Override
53 public void run() {
54 Toast toast = Toast.makeText(HomeActivity.this, message,
55 Toast.LENGTH_LONG);
56 toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 50);
57 toast.show();
58 }
59 });
60 }
61
62 public boolean checkPhone(String phone) {
63 Pattern pattern = Pattern
64 .compile("^[1]([3][0-9]{1}|59|58|88|89)[0-9]{8}$");
65 Matcher matcher = pattern.matcher(phone);
66 if (matcher.matches()) {
67 return true;
68 }
69 return false;
70 }
71 }
上面的代码主要是对用户的输入进行判断,这里限制必须是11位的电话号码,大家可以根据自己的想法更改。注意哦,这里需要添加调用拨号程序的权限
<uses-permission android:name="android.permission.CALL_PRIVILEGED" />,我这边使用的是CALL_PRIVILEGED,你也可以使用CALL_PHONE,它会直接拨号,我觉得不太友好,而上一个是调用拨号键盘。下面是Mainifest文件
1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.cnblog.activity"
4 android:versionCode="1"
5 android:versionName="1.0" >
6
7 <uses-sdk android:minSdkVersion="7" />
8
9 <application
10 android:icon="@drawable/ic_launcher"
11 android:label="@string/app_name" >
12 <activity
13 android:label="@string/app_name"
14 android:name=".CnBlogActivity"
15 android:screenOrientation="portrait"
16 android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >
17 <intent-filter >
18 <action android:name="android.intent.action.MAIN" />
19
20 <category android:name="android.intent.category.LAUNCHER" />
21 </intent-filter>
22 </activity>
23 <activity
24 android:name="HomeActivity"
25 android:screenOrientation="portrait" />
26 </application>
27
28 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
29 <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
30
31 </manifest>
这个标签android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"标明使用全屏模式。
好了,下面来测试你的程序吧,如果有真机可以直接发布到机子上,如果没有就只有创建模拟器了,由于模拟器创建起来太慢,我就偷个懒不再叙述如何在模拟器中发布了,大家可以参考这个文章:http://book.douban.com/reading/12919079/。好了,咱们下次再续。