这里介绍下,我们一般写一些小程序步骤:
- 画UI
- 根据UI写业务逻辑
- 测试
大型程序的话开始就不能够画UI了,而是要需求分析。
写一个拨号器安卓应用程序:
首先创建项目,然后一路Next。
修改界面显示的字符串为:”请输入手机号:”后就开始配置主界面的布局了。
配置布局在activity_main.xml中进行。
这里注意几个参数:
android:layout_width是当前控件的宽,它有如下几个属性值:
- wrap_content:空间占用为字体占用宽度。
- fill_parent:占用整行宽度。
- match_parent:占用整行宽度。
- fill_parent和match_parent没有什么功能上的区别,只是match_parent是安卓更新之后把fill_parent换了一个名字而已。
这里还有设置字体相关的:
- android:textSize=”19sp”,这里单位后面再讲。
- android:text=”FireLang”这里是设置控件里面的字体的。
这里要注意一点,android:text="@string/hello_world"
这里面的值既可以是现在这个样子,也可以直接改成你要显示的字符串。
这里要注意一个写法:@+id/edittext
的意思是在R.java里面的id方法里面添加edittext这个属性。
界面写好后,到了这里我们就要实现拨号的功能了,在实现之前我们应该要获取关于拨号的控件,这里会获取到文本域和按钮这两个控件。
写代码方面当然就写到主程序里面了。叫做MainActivity.java。它是第一个被运行的Activity,运行顺序在AndroidManufest.xml里面配置。
如果我们想要得到某些控件里面的值,你可以通过一个地址找到他。
findViewById(R.id.edittext);//所有的控件都继承了一个类叫做view,可以通过它查找控件
在我们把控件从activity_main.xml中配置好了后,就会自动的在bin里面生成对应的对象,也就是说Android自动帮你实现了,它会在底层自动实现。生成好后就给一个地址,方便我们能够找到这个对象,地址就是在R文件里面。通常就是我们配置好控件后自己设置的地址叫法。
好了开始获取控件吧。
//获取到电话号码
EditText editText=(EditText)findViewById(R.id.editText1);//查找出来的是view对象
//获取到拨号按钮
Button callButton=(Button)findViewById(R.id.button1);
如果用户输入的字符为空怎么办??
那么我们就得给用户一个提示:
Toast.makeText(MainActivity.this,"电话号码不能够为空",1);//显示的时间长为1,短为0
接下来就是拨打电话号码:
//Intent是意图
Intent intent=new Intent();
//设置意图为打电话
intent.setAction(Intent.ACTION_CALL);
//设置打谁的电话
intent.setData(Uri.parse("tel:"+number));
//开启意图
startActivity(intent);
但是,现在编译还是不行,因为还没有加权限,这里需要的权限是拨打电话。没有加权限是不能够正常运行的,会因为得不到权限而自己停止运行。
加权限在AndroidManifest.xml中配置。
选择权限。在permissions->users permission->permission_call_phone
好了现在就行了。注意:一定要记住加权限。
贴上MainActivity.java的源码:
package cn.domarvel.callphone;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText)findViewById(R.id.editText1);
//获取到拨号按钮
Button callButton=(Button)findViewById(R.id.button1);
callButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
String number=editText.getText().toString().trim();
if("".equals(number)){
Toast.makeText(MainActivity.this, "电话号码不能够为空", 1).show();
return;
}
//Intent是意图
Intent intent=new Intent();
//设置意图为打电话
intent.setAction(Intent.ACTION_CALL);
//设置打谁的电话
intent.setData(Uri.parse("tel:"+number));
//开启意图
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
这里要注意一点,editText要么是final要么是全局变量才可以在内部类中被访问,
为什么要是全局变量是因为方法调用时机不同,当调用点击事件的时候,可能方法已经执行完毕,调用的方法中变量已经被回收了,所以需要开启全局变量。那么为什么final也可以呢??
因为final(字符常量或者常量表达式,或者方法调用),那么当在class文件被加载到内存中后在准备过程会把final修饰的字段直接在被引用该值的地方替换成直接引用。
所以就需要这样来解决运行时机不同的问题了。