第一次写安卓应用程序,好激动。。。
首先右键资源管理器(我也不知道是不是叫这个名字) - new - android application project,填选一些东西之后,第一个安卓应用程序就创建好了。
例子是通过做一个电话拨号器来实现的。
先在Graphical Layout视图下拖拽控件,一个电话输入框(Phone),一个按钮(Button)
.xml文件源码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<!-- 电话输入框
1 android:id-定义输入框id:@代表java源码所在包下的R.java文件,
id代表R里的id方法,et_number就是给这个控件起的名字
2 match_parent:自适应父容器宽/长度,同fill_parent-->
<EditText
android:id="@+id/et_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="16dp"
android:ems="10"
android:inputType="phone" >
</EditText>
<!-- 拨打按钮
1 android:onClick:绑定onClick事件,必须在java源文件实现,否则报错
2 android:text:指向res/values/strings.xml文件下的name="dail"的string标签
快捷键:ctrl+1 -->
<Button
android:onClick="dailButtonClick"
android:id="@+id/bt_dail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/et_number"
android:layout_below="@+id/et_number"
android:layout_marginTop="18dp"
android:text="@string/dail" />
</RelativeLayout>
下面开始介绍方法的四种绑定方式。
加载布局文件需要在.java文件的onCreate方法里写上:setContentView(R.layout.activity_main);
给一个按钮绑定方法,首先要找到这个按钮;想要拨打电话就要找到我们输入的电话号码。
所以我们就可以在.java文件的onCreate方法里写上这两行代码分别获取电话号码和按钮控件:
EditText et = (EditText) MainActivity.this.findViewById(R.id.bt_dail);
Button bt = (Button) this.findViewById(R.id.bt_dail);
第一种: 给按钮注册单击事件,创建内部类,定义点击事件
首先创建内部类,实现OnClickListener接口,重写onClick事件:
private class MyListener implements OnClickListener{
// 1. 当按钮被点击时调用的方法
@Override
public void onClick(View arg0) {
callPhone();
}
}
这里的callPhone是调用的本类的一个方法:
//抽出来的拨打电话方法
private void callPhone() {
//将获取的editText转化成字符串
String num = et.getText().toString().trim();
//若号码为空则给出提示
if(TextUtils.isEmpty(num)){
Toast toast = Toast.makeText(MainActivity.this, "号码不能为空", Toast.LENGTH_SHORT);
toast.show();
return;
}else{
//若号码不为空那么就创建一个Intent类
Intent intent = new Intent();
//调用设置动作的方法setAction,传递参数Intent.ACTION_CALL
intent.setAction(Intent.ACTION_CALL);
//调用设置数据的方法setData,传递Uri。URL:统一资源定位符 URI:统一资源标识符
intent.setData(Uri.parse("tel:"+num));
//执行方法,即拨打电话
startActivity(intent);
}
}
最后就是在onCreate方法里绑定到按钮上了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载布局文件
setContentView(R.layout.activity_main);
//找到指定按钮,号码文本框
Button bt = (Button) this.findViewById(R.id.bt_dail);
EditText et = (EditText) MainActivity.this.findViewById(R.id.bt_dail);
// //1. 给按钮注册单击事件,创建内部类,定义点击事件
bt.setOnClickListener(new MyListener());
}
第二种:创建匿名内部类
很简单,就是直接在按钮的setOnClickListener方法里传一个参数,这个参数就是声明出来的匿名内部类实例同样是重写onClick事件,整段代码写到onCreate方法里即可:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载布局文件
setContentView(R.layout.activity_main);
//找到指定按钮,号码文本框
Button bt = (Button) this.findViewById(R.id.bt_dail);
EditText et = (EditText) MainActivity.this.findViewById(R.id.bt_dail);
//2. 创建匿名内部类
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
callPhone();
}
});
第三种:实现OnClickListener接口
使生成的MainActivity类实现OnClickListener接口,重写onClick事件,直接调用:
//实现OnClickListener接口
public class MainActivity extends Activity implements OnClickListener {
//将EditText改为全局变量
private EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载布局文件
setContentView(R.layout.activity_main);
//找到指定按钮
Button bt = (Button) this.findViewById(R.id.bt_dail);
et = (EditText) MainActivity.this.findViewById(R.id.bt_dail);
//3. 实现OnClickListener接口
bt.setOnClickListener(this);
}
//3.实现OnClickListener接口的onclick方法
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_dail:
callPhone();
break;
}
}
}
这里我一直有个地方搞不懂,那就是为什么bt调用了setOnclicklistener方法,然而他却执行了实现的onclick方法。又不能看源码,真是别扭。。。
而且听介绍说,这是最推荐使用的一种方式。。。
第四种:在布局文件绑定点击方法
上面的.xml文件,button标签里有一个属性android:onClick就是用来绑定点击事件的,所以.xml里起的名字是dailButtonClick,.java就要对应着有一个相同名字的方法dailButtonClick
//4. 在布局文件绑定点击方法
public void dailButtonClick(View v){
callPhone();
}
以上就是四种方法绑定方式,最主要的就是:
1.记住怎么布局应用程序界面,学会运用各种属性;
2.记住几个比较重要的方法,比如setContentView、通过id定位布局文件的空间this.findViewById(R.id.bt_dail)、按钮设置监听的方法Button.setOnClickListener、EditText获取文本的方法getText、判断文本是否为空的方法TextUtils.isEmpty(num)、显示提示信息Toast.makeText(MainActivity.this, "号码不能为空", Toast.LENGTH_SHORT)、Intent类里的设置动作的方法setAction和设置数据的方法setData、还有执行拨打电话这个动作的方法(我猜他和setContentView都来自父类Activity);
3.Button、EditText这两个类好像都来自widget类包?以后有时间查查去。。。
4.eclipse抽取一段代码出来单独做一个方法的方法:选中要抽取的代码—右键—Refactor—Extract Method然后就可以抽出来在哪个类里生成用什么修饰符修饰的方法了。。。快捷键alt+shift+m
这就是第一次学到的一点东西,也许有很多理解不到位的地方吧。希望以后能通过练习增强理解。