自从写了第一篇之后,我一直在考虑第二篇该如何写,要是像书本一样一个个介绍下去甚是无味也没这个精力,所以再三思索决定第二篇写个快速入门,让初学者可以迅速上手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 26 7 12 13 22 23
布局完之后我们就可以在我们的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 26 7 12 13 19 20 27 28
很简单的三个组件,文本,编辑框和按钮。好了,在创建一个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 26 7 8 9 12 27 2817 2318 2219 20 21 26 29 30 31
这个标签android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"标明使用全屏模式。
好了,下面来测试你的程序吧,如果有真机可以直接发布到机子上,如果没有就只有创建模拟器了,由于模拟器创建起来太慢,我就偷个懒不再叙述如何在模拟器中发布了,大家可以参考这个文章:。好了,咱们下次再续。