初会Android

来源:互联网 发布:手机知乎怎么看问题 编辑:程序博客网 时间:2024/05/01 13:06
经过两三天的Android的学习,终于进入状态了。 弄个登录的小Demo,以巩固一下。

一,Android的准备工作,诸如Eclipse,ADT等安装等略过,不再繁述。

二,新建Android项目

1,向导建项目

2,建好项目好,已经是个经典的HelloWorld,如何运行如下图

3,模拟器运行效果

三,对新建项目进行小析

新建的项目下目录结构如下图  

1,先谈res包

这里放的是资源,据我所接触到的,包括:版面的布局(在项目里主要是main.xml文件),比如TextView的长,高,字体,颜色等,还有多个控件按什么方式排列等信息;图片(在drawable目录下);颜色(在values目录下);字符串(在values目录下)等东西。

2,src包

目前这个项目就两类 R.java,Login.java,其中R.java是无需我们进行任何改动的,Login.java则是我们重点剖析的地方。

3,AndroidManifest.xml

该项目的主要信息放在此。

4,代码解析

4.1,Login.java

就目前项目而言,里面最重要的就是一句话:setContentView(R.layout.main);这句话表明了你的这个Login面板的布局(包括上面有什么控件)是由res/layout/main.xml定义的!

4.2,再来看看main.xml

4.2.1,根元素:LinearLayout

这表明了Login面板排列控件是线性排列的,API原话:A Layout that arranges its children in a single column or a single row(单行或单列)。在API里,对XML元素都有比较详细的说明。

4.2.2,根元素里面的其它属性

比如android:orientation(按行排还是按列排),android:layout_width等,在API里都有详细说明,并有相应的方法与之相对应。

4.2.3,再看子元素TextView

这是个什么呢?其实就是一个控件,类似Swing中的JLable。在xml文件里,也可以设置它的字体大小,字体颜色等,加上一个属性:android:textSize="20px",然后再改一个属性:android:text="Hello World"效果如下图:

4.3.3,最后一个小改吧

刚才说了资源里也可以定义字符串,首先在res/values/strings.xml里加上一个子元素:<string name="helloWorld">Hello World</string>。怎么用字符串资源呢?两种方法,一种是在其它的xml里引用它,另一种是在程序里调用它,在这里先介绍第一种,第二种稍后介绍。回到main.xml文件,改TextView元素的android:text属性的值:android:text="@string/helloWorld",再运行查看效果,和上图一样。

四,登录Demo开工

1,在Login面板上加个两个文本框(与上面的TextView不同,上面类似于Label。下面称之为编辑框)及一个按钮。

1.1,先加用户名编辑框

上面已经说过man.xml对Login面板的布局全权负责,因此,我们在main.xml进行动工,修改后代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><TextView android:layout_width="fill_parent"android:layout_height="wrap_content" android:text="@string/helloWorld"android:textSize="20px" /><EditText android:id="@+id/txtUsername"android:layout_height="wrap_content"android:layout_width="fill_parent" android:text="" /></LinearLayout>
其中我们加的代码如下:
<EditText android:id="@+id/txtUsername"android:layout_height="wrap_content"android:layout_width="fill_parent" android:text="" />
在这里,重点讲一下android:id这个属性,这个属性有什么用呢?其实很简单,引用,为了在程序里我们可以很快地引用该编辑框控件(然后可以获取它的文本值),怎么引用?稍后讲解! 运行效果如下图:

1.2,再加上密码框

其实与1.1就两个属性有区别:一个是android:id,一个是android:password(值为true或false),所加代码如下:
<EditText android:id="@+id/txtPassword"android:layout_height="wrap_content"android:layout_width="fill_parent" android:text=""android:password="true" />
运行效果如下图:  

1.3,再加上一个按钮

它的元素名称叫做Button,为了提醒资源和代码的分离,这里用了资源文件

1.3.1,在res/values/strings.xml里加上这么一句:

    <string name="login">Login</string>

1.3.2,回到main.xml文件,添加按钮,所加代码如下:

<Button android:id="@+id/btnLogin"android:layout_width="fill_parent"android:layout_height="wrap_content" android:text="@string/login" />
除了Button元素不一样外,其它的属性在上面均有提及,略过,至于Button的其它属性,看帮助文档吧,直接看类Button。 效果如下:  

1.4,光秃秃的,没点提示,用户界面不友好,在两编辑框前加上文本提示吧。

1.4.1,资源文件最终代码:

<?xml version="1.0" encoding="utf-8"?><resources><string name="app_name">Login</string><string name="helloWorld">Hello World</string><string name="login">Login</string><string name="username">Username:</string><string name="password">Password:</string></resources>

1.4.2,main.xml文件最终代码:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><TextView android:layout_width="fill_parent"android:layout_height="wrap_content" android:text="@string/username"android:textSize="20px" /><EditText android:id="@+id/txtUsername"android:layout_height="wrap_content"android:layout_width="fill_parent" android:text="" /><TextView android:layout_width="fill_parent"android:layout_height="wrap_content" android:text="@string/password"android:textSize="20px" /><EditText android:id="@+id/txtPassword"android:layout_height="wrap_content"android:layout_width="fill_parent" android:text=""android:password="true" /><Button android:id="@+id/btnLogin"android:layout_width="fill_parent"android:layout_height="wrap_content" android:text="@string/login" /></LinearLayout>
效果如下图:  

2,页面布局讨论完毕,给按钮加事件吧。

2.1,如何引用该按钮呢?

上面元素的里面所定义的属性:android:id派上用场,代码很简单。
Button btnLogin = (Button) this.findViewById(R.id.btnLogin);

2.2,为该按钮加上事件监听器吧

如果你接触过Swing,你会感到无比的亲切,终于找到懂的东西了。
btnLogin.setOnClickListener(new View.OnClickListener(){public void onClick(View view) {}});
具体的接口在这不讨论了,如果你有兴趣,可以看看帮助文档了。

2.3,登录功能的完成。

假设,用户输入"Daniel"及密码:"00000",则算登录成功,否则登录不成功(以弹出框为准)

2.3.1,获得用户名,代码如下,还是要先引用编辑框

btnLogin.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {// 获得用户名编辑框EditText txtUserName = (EditText) Login.this.findViewById(R.id.txtUsername);// 获得用户名编辑框内容Editable username = txtUserName.getText();// 改动编辑内容username.append("aaa");}});
注意,这里返回的是Editable对象,相当好用,在以前的Swing编程中,如果要改动一个文本框的内容,先要getText(),然后再setText(String text)回去,但这里不需要,如果你改动了EditText对象,编辑框里的内容相应发生变化。 按下按钮前后图片对比:

2.3.2,获得密码,与2.3.1类似,不再累述。

2.3.3,验证用户名和密码,重点:如何用代码引用字符串资源,弹出框

引用字符串资源,很好弄,getString(R.string.ok),如果你在资源文件里定义了这个字符串,则会被引用过来。 弹出框,AlertDialog.show(),该方法参数太多了,没去研究,选 了一个比较简单的。最后Login.java代码如下:
public class Login extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);Button btnLogin = (Button) this.findViewById(R.id.btnLogin);btnLogin.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {// 获得用户名编辑框EditText txtUserName = (EditText) Login.this.findViewById(R.id.txtUsername);// 获得用户名编辑框内容Editable username = txtUserName.getText();// 改动编辑内容// username.append("aaa");// 获得密码EditText txtPassword = (EditText) Login.this.findViewById(R.id.txtPassword);Editable password = txtPassword.getText();// 验证if (username.toString().equals("Daniel")&& password.toString().equals("00000")) {AlertDialog.show(view.getContext(), getString(R.string.app_name),R.drawable.icon, getString(R.string.ok),getString(R.string.ok_dialog), true);}else{AlertDialog.show(view.getContext(), getString(R.string.app_name),R.drawable.icon, getString(R.string.error),getString(R.string.ok_dialog), true);}}});}}

五,添油加醋

一个程序仅有打开,没有关闭,显得相当别扭,用按钮也可以实现登录功能,但内容重复,不是我们干的事情,因此,把退出功能放在Menu里来实现。

1,添加Menu

重写方法:public boolean onCreateOptionsMenu(Menu menu) 即可,代码如下: 为了突出效果,多加了两个,但我们只用一个,menu.add()方法,大家可以查看API
@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// 参数:group, id, titlemenu.add(0, 0, getString(R.string.exit));menu.add(0, 1, getString(R.string.exit));menu.add(0, 2, getString(R.string.exit));return true;}
效果:  

2,当某个菜单项被选中时的事件

也是重写方法:public boolean onOptionsItemSelected(Item item),代码如下:
@Overridepublic boolean onOptionsItemSelected(Item item) {if(item.getId() == 0){// 仅处理第一个菜单,其它的自己来吧this.finish();}return true;}
最后,整个Login.java代码如下:
import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.text.Editable;import android.view.Menu;import android.view.View;import android.view.Menu.Item;import android.widget.Button;import android.widget.EditText;public class Login extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);Button btnLogin = (Button) this.findViewById(R.id.btnLogin);btnLogin.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {// 获得用户名编辑框EditText txtUserName = (EditText) Login.this.findViewById(R.id.txtUsername);// 获得用户名编辑框内容Editable username = txtUserName.getText();// 改动编辑内容// username.append("aaa");// 获得密码EditText txtPassword = (EditText) Login.this.findViewById(R.id.txtPassword);Editable password = txtPassword.getText();// 验证if (username.toString().equals("Daniel")&& password.toString().equals("00000")) {AlertDialog.show(view.getContext(),getString(R.string.app_name), R.drawable.icon,getString(R.string.ok),getString(R.string.ok_dialog), true);} else {AlertDialog.show(view.getContext(),getString(R.string.app_name), R.drawable.icon,getString(R.string.error),getString(R.string.ok_dialog), true);}}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// 参数:group, id, titlemenu.add(0, 0, getString(R.string.exit));menu.add(0, 1, getString(R.string.exit));menu.add(0, 2, getString(R.string.exit));return true;}@Overridepublic boolean onOptionsItemSelected(Item item) {if(item.getId() == 0){// 仅处理第一个菜单,其它的自己来吧this.finish();}return true;}}

strings.xml内容如下:

<?xml version="1.0" encoding="utf-8"?><resources><string name="app_name">Login</string><string name="helloWorld">Hello World</string><string name="login">Login</string><string name="username">Username:</string><string name="password">Password:</string><string name="ok">Welcome Daniel!</string><string name="ok_dialog">OK</string><string name="error">Please check username and password!</string><string name="exit">Exit</string></resources>

3,修改Icon,背景

3.1,把一PNG图片(其它格式没试过),放于res/drawalbe/下,名字随便,在这里笔者取名login.png

修改地方:AndroidManifest.xml文件 将
<application android:icon="@drawable/icon">
改成:
<application android:icon="@drawable/login">
即可。 效果如下图:  

3.2,修改背景,在res/values/下新建一文件colors.xml,里面为:

<?xml version="1.0" encoding="utf-8"?><resources><color name="bg">#e5edfa</color></resources>
在main.xml根元素里加一属性
android:background="@color/bg"
效果如下:   整个源码下载地址:稍后放出,现在无法上传