Android入门
开发工具
- Eclipse + ADT(Android Developer Tools)
- Android Studio
- SDK (软件开发环境, Android调试工具, 模拟等)
SDK目录
- add-ons (额外开发资料, google地图资源)
- build-tools : 编译工具目录
- docs : 离线版开发文档
- extras : 向下兼容的jar包, intel工具
- platforms : Android开发版本平台jar包
- platform-tools : 平台开发工具(adb)
- sources : 开发平台源码
- system-images : 模拟器镜像文件
- tools : 开发者常用工具
Android 屏幕分辨率
- VGA: 480 x 640 标准大小
- HVGA: 320 x 480 一半大小
- QVGA: 240 x 320 四分之一
- WVGA: 480 x 800
- FWVGA: 480 x 854
开发工具
ADB (Android debug bridge) Android调试桥
- adb devices 查看当前已连接的设备
- adb start-server 开启 adb 服务
- adb kill-server 杀死 adb 服务
- adb shell 进入Android控制台(执行Linux命令)exit退出
- adb logcat 打印日志信息
- adb install xxx.apk : 安装应用
- adb uninstall 包名 : 根据包名卸载应用
- adb push hiahia.txt /sdcard/hiahia.txt : 上传文件
- adb pull /sdcard/hiahia.txt . : 下拉文件
-
adb -s emulator-5554 :指定设备
-
adb可能因为360, 金山卫士, 腾讯QQ影响无法使用
- 端口5037被占用
- netstat -ano | find "5037" 查看谁占用端口
- 杀掉进程kill pid
如何在手机上运行Android项目
- 买根数据线
- 插上电脑
- 装驱动(驱动精灵,驱动人生,应用宝,360手机卫士)
- 开启usb调试模式
R文件报错处理:
- 不能以关键字命名
- 资源不能以数字开头
- 布局文件内部有错误, 有小红叉
点击事件的4种写法
- 定义一个内部类实现OnClickListener接口
- 使用匿名内部类对象实现
- 使用当前类,继承接口
- 定义xml属性
- 定义xml的属性android:onClick="call"
- 在代码里写方法 public void call(View view){}
短信发送器
- 拿到联系人电话号码
- 群发短信
写一个Android项目
- 创建一个Android Project
- 写UI界面布局.
- 根据业务逻辑写Java代码.
Android常见布局
-
LinearLayout 线性布局
- 控件一个接一个排列
-
RelativeLayout 相对布局
- 控件之间以相对位置排列
-
FrameLayout 帧布局
- 一层盖一层
-
AbsoluteLayout 绝对布局
- 通过x, y指定绝对位置.
-
TableLayout 表格布局
- 类似Html表格
Android的颜色模式
RGB (Red, Green, Blue) #FF0000
点击事件的几种写法
- 内部类实现OnClickListener接口
- 让当前的activity实现OnClickListener接口
- 匿名内部类
- 定义onclick的属性,绑定点击的方法名
举个栗子:
1 package cn.message; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.telephony.SmsManager; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.EditText; 9 import android.widget.Toast; 10 //让当前的Activity实现OnClickListener接口 11 public class MainActivity extends Activity implements OnClickListener { 12 EditText phonenumber = null; 13 EditText messages = null; 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 // 获取界面上的文本输入框 19 phonenumber = (EditText) findViewById(R.id.phonenum); 20 messages = (EditText) findViewById(R.id.message); 21 22 // 获取界面上的按钮 23 Button send_btn = (Button) findViewById(R.id.send); 24 Button send_btn2 = (Button) findViewById(R.id.send2); 25 Button send_btn3 = (Button) findViewById(R.id.send3); 26 //第四个按钮是重置按钮,用于重置已输入的内容, 27 //已在在布局文件定义 android:onClick="resrt" 28 29 /* 30 * 方法一:让当前的Activity实现OnClickListener接口,然后重写点击事件方法 31 */ 32 send_btn3.setOnClickListener(this); 33 34 /* 35 * 方法二:匿名内部类方法的点击事件 36 */ 37 send_btn.setOnClickListener(new OnClickListener() { 38 @Override 39 public void onClick(View v) { 40 String num = phonenumber.getText().toString().trim(); 41 String mess = messages.getText().toString(); 42 // 判断取得的手机号和信息是否为空 43 isPass(num, mess); 44 } 45 }); 46 47 /* 48 * 方法三:自定义内部类实现OnClickListener接口 49 */ 50 send_btn2.setOnClickListener(new MyOnClickListener()); 51 } 52 private class MyOnClickListener implements OnClickListener { 53 @Override 54 public void onClick(View v) { 55 // TODO Auto-generated method stub 56 String num = phonenumber.getText().toString().trim(); 57 String mess = messages.getText().toString(); 58 // 判断取得的手机号和信息是否为空 59 isPass(num, mess); 60 } 61 } 62 // 让当前的Activity实现OnClickListener接口,然后重写的点击事件方法 63 @Override 64 public void onClick(View v) { 65 // TODO Auto-generated method stub 66 switch (v.getId()) { 67 case R.id.send3: 68 String num = phonenumber.getText().toString().trim(); 69 String mess = messages.getText().toString(); 70 // 判断取得的手机号和信息是否为空 71 isPass(num, mess); 72 break; 73 default: 74 break; 75 } 76 } 77 /* 78 * 方法四:在布局文件定义 android:onClick="resrt" 79 */ 80 public void reset(View v) { 81 //清空输入框 82 phonenumber.setText(""); 83 messages.setText(""); 84 } 85 /** 86 * 方法,通过判断传过来的手机号和短信号码是否为空来确定是否发送短信 87 * 88 * @param num 89 * 手机号 90 * @param mess 91 * 短信内容 92 */ 93 public void isPass(String num, String mess) { 94 // TODO Auto-generated method stub 95 if (!(num.equals("") || mess.equals(""))) { 96 // 获取系统默认的短信管理器实例 97 SmsManager sms = SmsManager.getDefault(); 98 sms.sendTextMessage(phonenumber.getText().toString(), null, 99 messages.getText().toString(), null, null); 100 // 发送成功,重置手机号、信息输入框内容 101 phonenumber.setText(""); 102 messages.setText(""); 103 // 提示发送成功 104 Toast.makeText(MainActivity.this, "发送成功!", Toast.LENGTH_SHORT) 105 .show(); 106 } else { 107 // 提示发送失败 108 Toast.makeText(MainActivity.this, "手机号或短信内容不能为空!", 109 Toast.LENGTH_SHORT).show(); 110 } 111 } 112 }
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context=".MainActivity" > 10 <TextView 11 android:id="@+id/textView1" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:layout_alignParentLeft="true" 15 android:text="@string/phone_s" /> 16 <EditText 17 android:id="@+id/phonenum" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content" 20 android:layout_alignLeft="@+id/textView1" 21 android:layout_below="@+id/textView1" 22 android:layout_marginTop="14dp" 23 android:ems="10" 24 android:inputType="phone" > 25 <requestFocus /> 26 </EditText> 27 <TextView 28 android:id="@+id/textView2" 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" 31 android:layout_alignLeft="@+id/phonenum" 32 android:layout_below="@+id/phonenum" 33 android:layout_marginTop="22dp" 34 android:text="@string/message_s" /> 35 <EditText 36 android:id="@+id/message" 37 android:layout_width="wrap_content" 38 android:layout_height="100dp" 39 android:layout_alignLeft="@+id/textView2" 40 android:layout_below="@+id/textView2" 41 android:layout_marginTop="33dp" 42 android:ems="10" 43 android:inputType="textMultiLine" /> 44 <Button 45 android:id="@+id/reset_b" 46 android:layout_width="wrap_content" 47 android:layout_height="wrap_content" 48 android:layout_below="@+id/message" 49 android:layout_toRightOf="@+id/textView1" 50 android:onClick="reset" 51 android:text="@string/reset_b" /> 52 <Button 53 android:id="@+id/send2" 54 android:layout_width="wrap_content" 55 android:layout_height="wrap_content" 56 android:layout_below="@+id/reset_b" 57 android:layout_marginTop="20dp" 58 android:layout_toRightOf="@+id/textView1" 59 android:text="@string/send_b2" /> 60 <Button 61 android:id="@+id/send3" 62 android:layout_width="wrap_content" 63 android:layout_height="wrap_content" 64 android:layout_alignBaseline="@+id/send2" 65 android:layout_alignBottom="@+id/send2" 66 android:layout_alignLeft="@+id/send" 67 android:text="@string/send_b3" /> 68 <Button 69 android:id="@+id/send" 70 android:layout_width="wrap_content" 71 android:layout_height="wrap_content" 72 android:layout_above="@+id/send2" 73 android:layout_alignRight="@+id/message" 74 android:text="@string/send_b" /> 75 </RelativeLayout>