初会Android

经过两三天的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. */

	@Override

	public 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
	@Override

	public boolean onCreateOptionsMenu(Menu menu) {

		// 参数:group, id, title

		menu.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),代码如下:
	@Override

	public 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. */

	@Override

	public 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);

				}

			}

		});

	}



	@Override

	public boolean onCreateOptionsMenu(Menu menu) {

		// 参数:group, id, title

		menu.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;

	}



	@Override

	public 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"
效果如下:   整个源码下载地址:稍后放出,现在无法上传
简明、完整、全面的安卓开发demo集合,包含如下示例 1、LinearLayout Button、RadioGroup、 CheckBox 2、TableLayout 3、FrameLayout 霓虹灯效果 4、RelativeLayout 梅花效果 5、自定义view跟着触点走的小球 6、 ListView 列表视图 7、WebView web视图 8、ToggleButton 动态布局效果 9、AnalogClock 、 DigitalClock and Chronometer 时钟和数字日期 10、AutoCompleteTextView 根据输入自动补充可能的全部 11、Spinner View 选择框(弹出框形式选择) 12、DatePicker TimePicker View 日期时间选择器 13、ProgressBar View 普通进度条、显示在标题栏上的进度条 14、RatingBar View 评级 15、 SeekBar 拖动条,音量调节效果 16、ScrollView 、HorizontalScrollView 垂直和水平滚动条 17、ScrollView 、HorizontalScrollView 垂直和水平滚动条 18、ExpandableListView 分组可展开收缩的ListView 19、Notification 状态栏通知 20、GridView、ImageSwitcher 21、SmsManager 消息管理器,发短信(这里是模拟器只能给其它模拟器发短信) 22、Intent Action、Category属性 测试 23、系统 Action、Category属性 24、ClipDrawable 徐徐展开的风景 25、AnimationDrawable 会动的图片 26、Menu、SubMenu、ContextMenu xml配置menu 27、Attribute 自定义view的duration属性 控制图片的透明度 28、Bitmap、BitmapFactory 图形与图像处理 29、Canvas 绘制自定义图形 30、Canvas 采用双缓存实现画图板 31、SharedPreference 简单的key-value数据存取 32、SQLiteDatabase 安卓客户端的嵌入式数据库 33、GestureDetector + ViewFlipper实现翻页效果 34、GestureLiberay 自定义手势 35、GestureLiberay 通过自定义的手势实现用户操作 36、TextToSpeech 语音朗读 37、ContentProvider、ContentResolver 应用之间共享数据 38、 Service 相当于没有界面的activity 39、Activity与Service运行中通信 40、Service 相当于没有界面的activity 41、AIDL Service android中的跨进程调用 客户端,服务端见AidlService 42、BroadcastReceiver 接收广播消息 43、非UI线程中不能操作UI线程中的View测试 44、ImageSwitcher animation gesture实现可以滑动的跑马灯 45、下载状态栏显示下载进度 46、Gallery3d效果 47、ListView 上拉加载更多效果 48、异步加载图片的二级缓存技术 49、QQ的好友列表展示效果 50、Fragment + ViewPager实现tab滑动切换 51、能够显示在桌面前面的的歌词效果 52、activity切换特效
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值