android开发手记一
- 初识安卓—工具准备
一般是要下载java,eclipse,android sdk。
下载java sdk,配置环境变量。测试java是否安装成功。
然后去android developers网站http://developer.android.com/sdk/index.html,下载对应的版本(例如adt-bundle-windows-x86-20131030.zip),解压到特定文件夹,启动解压的目录下(如F:\adt-bundle-windows-x86-20131030\eclipse)的eclipse(因为这个版本已经包含了eclipse)即可
- 第一个app开发
在eclipse中,点击New à Android Application Project,输入如下内容
点击Next,出现如下设置启动图标
本例中直接Next,然后进入activity模板设置界面
本例选择Blank Activity,Next
Finish结束。
- 运行App
在开发之前,有必要先了解下一些重要文件的组成。
(1) AndroidManifest.xml
这个文件定义了一些这个app的基本特征,其中最重要的一个元素是<uses-sdk>,它用来描述了这个app与android的适配程度,android:targetSdkVersion这个元素应该尽可能高,表示最新版本,并在其描述的版本下进行测试。
(2) src/
app的源代码目录,默认包含一个app启动时使用app icon的Activity类
(3) res/
包含一些子类。
1) drawable-hdpi/
drawable objects (such as bitmaps)的目录,用于高分辨率屏幕。
其他drawable目录包含对应分辨率的目录
2) layout/
用于定义app用户界面的文件
3) values/
各种xml文件目录,包含String和color等定义。
当你运行一个默认的app,它会首先调用默认的Activity类,然后加载layout文件,显示helloworld
- 运行在真实的机器
使用usb数据线接上电脑,在安卓机启用USB debugging。(如果是android 3.2以前的是在设置 – 应用 --- 开发,4.0以后在设置 – 开发选项,其中开发选项默认是隐藏的,需要在设置 --- 关于手机里,点击Build number 7次,再回去就发现有该选项了)
在eclipse中运行
打开项目中任一文件,点击 Run ,在弹出框选择android application,这时eclipse便会自动在手机上安装该应用,然后启动
- 运行在虚拟机上
首先需要创建个Android Virtual Device。在eclipse中点击Android Virtual Device Manager ,点击New,输入虚拟机名称,目标平台,SD卡大小,和皮肤(默认是HVGA),
- 构建简单的UI界面
Android的UI是通过使用一系列View和ViewGroup对象。View对象组件通常是一些buttons,text fields之类的组件,而ViewGroup对象是View的容器,用于定义组件如何显示。
在android中,是通过XML来定义组件的层级架构。
(1) 在res/layout/以XML Viewer打开activity_main.xml
样式如下
首先删除TextView元素,并将<RelativeLayout>改成<LinearLayout>,并添加android:orientation属性,设置其值为"horizontal",效果应该如下
LinearLayout是一个ViewGroup子类,按照orientation属性来显示child views,LinearLayout的元素按在XML中的顺序依次显示。
因为LinearLayout是根View,所以它的width和height应显示全屏,所以是match_parent。
(2) 添加text field
在LinearLayout内添加个Text Field,内容如下
其中属性android: id可以独一无二的标记该EditText View
当你试图在XML中引用任何resource对象,就需要使用At符号@,随后是resource类型(这里是id),反斜杠,再是resource名称(这里就相当于定义了一个变量edit_message,该变量指向一个resource文件(此时还未指向到哪个resource文件),以后要想使用该resource,就可以直接调用该变量)
当你第一次定义一个resource id(这里是edit_message),需要在resource类型前加加号+符号,编译时SDK工具便会在gen/R.java中创建一个resource id(效果如下,相当于id.edit_message变量
public static final class id {
public static final int edit_message=0x7f080000;
}
)指向该EditText元素。
一旦定义后,指向该引用的就不需要再使用加号符号
android:layout_width和android:layout_height中的wrap_content指定它应该和View的内容大小保持一致,如果用match_parent,则EditText元素会全屏。
android:hint用于当text field为空时默认应该显示的内容,这里不使用硬编码,而是@string/edit_message指向一个resource文件,因为还没有定义edit_message指向的resource,所以这里会有错误。
如果这里添个加号,换成@+string/edit_message, 则会在R.java中string类会增加一个edit_message变量,相当于string.edit_message。
(3) 添加string resource
当需要在用户UI中显示内容,应该将该内容串申明为一个resource
默认的这些string resource在res/values/strings.xml,添加一个edit_message变量,并设置为“Enter a Message”,同时再添加个button_send变量,值为“Send”,结果如下
此时上面的错误消失
(4) 添加一个Button
在activity_main.xml中添加Button控件,如下
这里不需要android:id因为下面activity将不引用,layout_width和layout_height设置为wrap_content,所以这个按钮将只有刚好能完全显示text内容的大小。这样设置完以后,效果就会如下图
这里有个问题,就是Send按钮宽度不变,但EditText如果用户输入增多它应该变长,所以需要android:layout_weight来设置,这个属性默认都是0,它可以设置为任意大于0的值,它代表的这个控件与其兄弟元素的比例,比如说现在EditText设置为1,Send设置为2,则EditText宽度就是1/3,而Send就是2/3。
将EditText修改如下
这样EditText控件显示宽度就是1/1,而Send则是最小宽度,这里讲layout_width修改为0dp是为了提高效率,wrap_content是需要系统来计算组件的宽度,这样现在的效果就会如下
(5) 连上手机,在eclipse点击 启动即可。
- 启动另一个活动
本节将在用户点击Send按钮启动一个新的活动。
打开activity_main.xml布局文件,在Button按钮添加android:onClick属性,设置android:onClick="sendMessage",其中sendMessage就是当用户点击Send时系统调用的方法。
接下来在src/MainActivity.java中添加该方法,如下
需要导入View类,eclipse中可以使用ctrl+shift+O快捷键导入。
为了能正确被引用,该方法必须是:
1) 必须是public
2) 需要return a void value
3) 有个View类作为唯一参数(这个View就是被点击的view)
接下来构建一个Intent
An Intent is an object that provides runtime binding between separate components (such as two activities).
Intent表示“intent to do something”,通常用于启动另一个activity。
在sendMessage方法内,创建一个Intent类用于启动一个叫DisplayMessageActivity的服务,Intent intent = new Intent(this, DisplayMessageActivity.class);
构造函数有两个参数,Context类是第一个参数(这里this是因为这个Activity类是Context类的子类),第二个参数用于表示系统将该Intent传递给哪个组件(这里就是讲该Intent传递给DisplayMessageActivity.class)
此时因为DisplayMessageActivity还不存在,所以暂时会报错。,效果如下
Intent不仅可以启动另一个服务,还可以传递一些数据,在sendMessage方法内,我们将使用findViewById()来获取EditText元素并将其值添加到该Intent,如下
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
Intent可以包含一组键-值对(key-value pairs)数据称为extras,putExtra()方法第一个参数是key,第二个参数是value。
为了让第二个参数请求extra数据,需要使用一个public常量作为该Intent的extra的key,所以在MainActivity类开始添加一句
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
一般都会使用app的package名字来做前缀来定义intent的extra中的key。
启动第二个活动
为了启动一个活动,使用startActivity()方法并传递你的Intent,系统便会响应该请求然后启动Intent指定的Activity,这样MainActivity.java整个就应该如下
下面创建DisplayMessageActivity类
Eclipse中点击New – Android Activity,选择Blank Activity,如下
点击Next,在下一页如下设置
点击Finish结束。
打开DisplayMessageActivity.java,可以发现已经存在onCreate()方法,onCreateOptionsMenu()方法,onOptionsItemSelected()方法。整个DisplayMessageActivity.java内容如下
这里由于ActionBar API只有在HONEYCOMB版本以上,所以在使用getActionBar()方法之前会检查下当前的系统版本
另外@SuppressLint("NewApi") tag to the onCreate() method to avoid lint errors.
所以Activity子类都必须实现onCreate()方法,当系统创建一个该Activity实例就会调用该方法,同时在该方法内必须使用setContentView()定义该活动布局。
添加标题(title string)
在strings.xml文件添加如下一句(该eclipse已自动添加,无需手动添加)
将该Activity添加到AndroidManifest.xml(同样eclipse中已自动添加,无需手动添加),如下
接收Intent
每个Activity都是由一个Intent激活,通过调研getIntent()方法可以得到Intent,所以需要在DisplayMessageActivity类中的onCreate()方法中添加如下
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
显示接收到的消息
为了显示消息,需要创建一个TextView,并通过setText()设置内容,然后通过setContentView()方法将TextView添加到该Activity布局的root view。这样,完整的onCreate()方法应该如下
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the message from the intent
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
// Create the text view
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
// Set the text view as the activity layout
setContentView(textView);
}
接下来点击运行启动,第一个Hello World的app到此为止
注:此时接上机器运行的时候,报错The connection to adb is down, and a severe error has occurred,这个错误主要是由于主要是由于adb没法正常运行起来;而adb没法运行起来,主要是其端口被占用了;常见的,可能的占用adb端口的,是你当前电脑上和手机相关的管理软件,比如豌豆荚,91等,所以解决办法是:强制关闭再运行eclipse(我的是在任务管理器中终止了tadb进程后就ok了)。