我们生活中会遇到各种各样的登录界面,需要输入你的账号和密码,像登陆QQ呀,各种软件都需要这种设计,那我们今天来实现一下吧~~
首先,界面的设计如下:
可以看出,我们需要两个可编辑文本框,用来输入用户名和密码,同时,我们要提示出要输入的类型,用hint来提示;我们需要一个checkbox来判断我们是否选择保存密码,还需要一个登陆button;由于整个线性布局是垂直的,因此两个可编辑文本框,一个checkbox,一个button在垂直方向上依次排列,这样不是很美观,因此我们需要再建立一个相对布局,使checkbox与button排列在一行。具体实现如下:
android:id="@+id/mUserName"android:hint="用户名"android:layout_width="match_parent"android:layout_height="wrap_content" />
android:layout_below="@+id/mUserName"android:id="@+id/mPassWord"android:hint="密码"android:layout_width="match_parent"android:layout_height="wrap_content" />
android:layout_width="wrap_content"android:layout_height="wrap_content">
android:layout_centerVertical="true"android:id="@+id/mCheckBox"android:text="是否保存密码"android:layout_width="wrap_content"android:layout_height="wrap_content" />
android:id="@+id/mButton"android:text="登陆"android:layout_alignParentRight="true"android:layout_width="wrap_content"android:layout_height="wrap_content"
/>
设计完界面之后,我们来实现Activity:
实现用户登录界面需要几个步骤:
1、因为Activity一启动就会调用onCreate()函数,因此在onCreate()函数中获取界面中的各个控件,通过findViewById()函数。
2、为button设置一个监听器,当点下button并勾选checkbox时mCheckbox.isChecked(),获取用户名与密码,通过输出流输出到内部存储的info.txt文件中,为了方便读取,我们设置##来分割用户名与密码。
3、不管有无勾选checkbox,只有点击了button,我们就生成吐司提示界面,参数依次为:上下文环境(即当前Activity),要输出的字符串以及输出时间(3s或5s)
4、保存密码功能实现的是当用户退出程序,再一次进入时,已显示出用户名与密码,我们通过readfrominfo()方法进行实现。
5、readfrominfo()中,为了方便对数据的操作,我们首先要把文件字节流转化成输入流再转化为字符流,这样我们就可以调用字符流的readline()函数(即实现按行读取),若文件有多行,则设置循环while(下一行不为空){执行readline()},这样我们就把info.txt中的信息读到了字符串中了,我们把字符串中按##分割的各部分存入字符串数组中,则数组[0]为用户名,数组[1]为密码。
6、因为我们在一进入软件就会执行onCreate()函数,所以在这里面我们就要调用readfrominfo()函数,但是,如果用户是第一次登陆,并没有生成info.txt,直接调用readfrominfo()函数肯定会出错,因此在readfrominfo()函数中,我们要进行判断,判断info.txt文件是否存在file.exits()
代码如下:
packagecom.administrator.login;importandroid.os.Bundle;importandroid.support.design.widget.FloatingActionButton;importandroid.support.design.widget.Snackbar;importandroid.support.v7.app.AppCompatActivity;importandroid.support.v7.widget.Toolbar;importandroid.view.View;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.widget.Button;importandroid.widget.CheckBox;importandroid.widget.EditText;importandroid.widget.Toast;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.FileReader;importjava.io.IOException;importjava.io.InputStreamReader;public class login extendsAppCompatActivity {privateEditText mUsername;privateEditText mPassWord;
String username=null;
String password=null;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Button mButton=(Button)findViewById(R.id.mButton);
mUsername=(EditText)findViewById(R.id.mUserName);
mPassWord=(EditText)findViewById(R.id.mPassWord);final CheckBox mCheckbox=(CheckBox)findViewById(R.id.mCheckBox);
readfrominfo();//调用读内部存储函数
mButton.setOnClickListener(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {if(mCheckbox.isChecked()){
username=mUsername.getText().toString();
password=mPassWord.getText().toString();
File file= new File(getFilesDir(),"info.txt"); //写内部存储到info.txt文件
FileOutputStream fos= null; //创建输出流
try{
fos= newFileOutputStream(file);
}catch(FileNotFoundException e) {
e.printStackTrace();
}try{
fos.write((username+"##"+password).getBytes()); //将username##password按位写入文件中
fos.close(); //关闭流
} catch(IOException e) {
e.printStackTrace();
}
}
Toast.makeText(login.this,"登陆成功",Toast.LENGTH_SHORT).show(); //吐司界面,参数依次为提示发出Activity,提示内容,提示时长
}
});
}//读内部存储函数
public voidreadfrominfo(){
File file= new File(getFilesDir(),"info.txt");if(file.exists()){
BufferedReader br= null;try{
br= new BufferedReader(new InputStreamReader(new FileInputStream(file))); //将字节流转化为输入流然后转化为字符流
} catch(FileNotFoundException e) {
e.printStackTrace();
}
String str= null;try{
str=br.readLine();
}catch(IOException e) {
e.printStackTrace();
}
String [] up= str.split("##"); //将字符串按##分割的部分依次存入字符串型数组up中
mUsername.setText(up[0]); //填写username与password
mPassWord.setText(up[1]);
}
}
}
输出结果:
原文:http://www.cnblogs.com/soada/p/5693693.html