1、1在res/layout目录下添加activity_login.xml和activity_diary.xml文件,并将原来的activit_main.xml删除2. 在activity_login.xml添加相应的控件一个TextView用来显示“我的日记”一个EditView用来输入用户名一个EditView用来输入密码一个CheckBox复选框用来让用户对是否记住用户名和密码一个Button作为登录按钮一个ProgressBar用来登录时,模拟后台验证等待Activit_login.xml布局文件:* *3在activity_diary.xml中添加相应的控件添加一个EditText用来输
2、入日记的内容,并且缺省为“请在这儿写下你的心情日记”,用来提示用户在该空间中进行日记内容的输入添加一个Button,当用户单击该按钮时,对用户输入的日记内容进行保存添加一个Button,当用户单击该按钮时,退出该应用程序activity_diary.xml布局文件:* *4一般情况下,在布局文件中使用的字符串资源(比如按钮名称),存放在字符串资源文件中,字符串资源文件存放在res/values目录下,文件名称为strings.xml在该程序中,strings.xml文件内容为* 我的日记 Settings Hello world! 用户名 密码 记住密码 登录 保存 退出 我的日记 请在这儿写
3、下你的心情日记*5在res目录下创建menu文件夹,两种方法,一种是在文件夹下添加一个目录,另一种是在工程下新建一个目录在menu目录下新建一个main.xml文件,我们用这个文件来创建一个选项菜单* *6.分别创建LoginActivity.java和DiaryActivity.java文件在LoginActivity.java中添加变量除了TextView外,为几乎每个控件对应的添加一个变量变量:*EditText usernameEdit; / 用户名输入框EditText pwdEdit; / 密码输入框CheckBox rememberPwdCheck;/ 记住密码的复选框Butto
4、n loginBtn;/ 登录按钮ProgressBar progressBar;/ 进度条SharedPreferences pref; / 简单数据存储Handler handler; / 线程的手柄static final int STOP = 0x111;/ 进度完成的标志static final int CONTINUE = 0x112;/ 继续显示进度条的标志static final int MAX = 100; / 最大的进度为100%int progress; / 进度条的当前进度*其次,定义了STOP、CONTINUE和MAX三个常量,这是处理进度条时用到的常量Handler
5、变量是一个线程句柄,progress记录当前的进度前面的初始化工作都在onCreate内进行,而且也是在onCreate中对变量添加监听器,同时实现监听事件的响应函数,而在今天的学习中,初始化工作是在一个init()函数中完成的,而且监听器也是用一个专门的setListeners()来完成。问题:为什么不在onCreate()完成所有的操作呢?解答:如果全部在onCreate中实现,使得该函数过于庞大,导致程序难以理解, 程序可读性差。分开来做,由init完成初始化工作,由setListeners来完成监听事件的相关操作,使得程序更有条理性,每一个函数完成一个或者少数功能,程序可读性强,便于维
6、护。LoginActivity.java:*package cn.xatu.cs.mydiary;import android.opengl.Visibility;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import andr
7、oid.content.SharedPreferences.Editor;import android.view.Menu;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.inputmethod.InputMethodManager;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditTex
8、t;import android.widget.ProgressBar;import android.widget.Toast;public class LoginActivity extends Activity EditText usernameEdit; / 用户名输入框 EditText pwdEdit; / 密码输入框 CheckBox rememberPwdCheck;/ 记住密码的复选框 Button loginBtn;/ 登录按钮 ProgressBar progressBar;/ 进度条 SharedPreferences pref; / 简单数据存储 Handler han
9、dler; / 线程的手柄 static final int STOP = 0x111;/ 进度完成的标志 static final int CONTINUE = 0x112;/ 继续显示进度条的标志 static final int MAX = 100; / 最大的进度为100% int progress; / 进度条的当前进度 Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_logi
10、n); init(); / 初始化工作 setListeners();/ 事件监听 void init() /* 初始化控件变量 */ initViews(); /* 初始化线程的手柄 */ initHandler(); void initViews() usernameEdit = (EditText) findViewById(R.id.edit_username); pwdEdit = (EditText) findViewById(R.id.edit_pwd); rememberPwdCheck = (CheckBox) findViewById(R.id.check_remember
11、Pwd); loginBtn = (Button) findViewById(R.id.btn_login); progressBar = (ProgressBar) findViewById(R.id.progressbar); pref = getSharedPreferences(userinfo, Context.MODE_PRIVATE); usernameEdit.setText(pref.getString(USERNAME, ); if (pref.getBoolean(REMBERPWD, false) pwdEdit.setText(pref.getString(PWD,
12、); else pwdEdit.setText(); rememberPwdCheck.setChecked(pref.getBoolean(REMBERPWD, false); progress = 0; progressBar.setProgress(progress); progressBar.setMax(MAX); void initHandler() handler = new Handler() Override public void handleMessage(Message msg) / TODO Auto-generated method stub switch (msg
13、.what) /* 进度未完成 */ case CONTINUE: if (!Thread.currentThread().isInterrupted() / 当前线程正在运行 progressBar.setProgress(progress); break; /* 进度完成 */ case STOP: Intent intent = new Intent(); intent.setClass(LoginActivity.this, DiaryActivity.class); startActivity(intent); finish(); / 结束该Activity break; defau
14、lt: break; super.handleMessage(msg); ; void setListeners() loginBtn.setOnClickListener(new OnClickListener() Override public void onClick(View v) / TODO Auto-generated method stub String username = usernameEdit.getText().toString(); String pwd = pwdEdit.getText().toString(); if (!username.equals(adm
15、in) | (!pwd.equals(admin) Toast.makeText(LoginActivity.this, 用户名或密码不正确, Toast.LENGTH_LONG).show(); else /*用户名与密码都正确的情况处理*/ Editor editor = pref.edit(); if (rememberPwdCheck.isChecked() editor.putString(USERNAME, username); editor.putString(PWD, pwd); editor.putBoolean(REMBERPWD, true); mit(); else e
16、ditor.putBoolean(REMBERPWD, false); mit(); usernameEdit.setEnabled(false); pwdEdit.setEnabled(false); loginBtn.setEnabled(false); /*将显示进度条5秒钟*/ progressBar.setVisibility(View.VISIBLE); new Thread(new Runnable() Override public void run() / TODO Auto-generated method stub try /*循环5次,每次睡眠1秒钟*/ for (in
17、t i = 0; i left & ev.getX() top & ev.getY() bottom) / 点击EditText的事件,忽略它。 return false; else return true; / 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点 return false; / 隐藏软键盘 private void hideSoftInput(View view) InputMethodManager manager = (InputMethodManager) getSystemService(Cont
18、ext.INPUT_METHOD_SERVICE); if (manager != null) manager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); *附:static final int的相关解释1.static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程
19、中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。2,final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函
20、数中给另外的值。 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。 另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用3.static final int 一般用于常量定义DiaryActivity.java:*package cn.xatu.cs.mydiary;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import ja