网课笔记 -- 安卓入门 -- 数据存储 --- 小项目-- 登录&&注册

登录注册 

# 界面一 activity_main  ---- 成功登陆以后的主界面
  - TextView 控件:欢迎进入XXX系统 

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="example.demo0904.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="欢迎进入XXX系统"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>

# 界面二 activity_user_login --- 登录界面
  - 线性布局
    · ImageView 【logo】
    · EditText X2 【用户名输入 and 密码输入】
    · Button 【登陆按钮】
      ~ 监听 doLogin
    · TextView 【注册选项】
      ~ 监听 doRegister

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp"
    tools:context="example.demo0904.UserLoginActivity">


    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/im_logo"/>

    <EditText
        android:id="@+id/id_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="请输入用户名 "
        android:inputType="textPersonName"
        />

    <EditText
        android:id="@+id/id_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="请输入密码"
        android:inputType="textPassword"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#7BBCFC"
        android:onClick="doLogin"
        android:text="登录"
        android:textColor="#fff"/>

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_marginTop="30dp"
        android:background="#0000"
        android:onClick="doRegister"
        android:text="点此注册"
        android:textAlignment="center"
        android:textColor="#7BBCFC"
        android:textSize="18sp"/>

</LinearLayout>

# 界面三
  - 线性布局
    · TextView [用户注册 -- 界面提示]
    · EditText X3 [用户名 密码 确认密码]
    · Button [确认注册按钮]
      ~ 监听 doRegister

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dp"
    tools:context="example.demo0904.UserRegisterActivity">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="用户注册"
        android:textAlignment="center"
        android:textColor="#7BBCFC"
        android:textSize="18sp"/>

    <EditText
        android:id="@+id/id_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:ems="10"
        android:hint="请输入用户名"
        android:inputType="textPersonName"
        />

    <EditText
        android:id="@+id/id_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:ems="10"
        android:hint="请输入密码"
        android:inputType="textPassword"
        />

    <EditText
        android:id="@+id/id_verify"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:ems="10"
        android:hint="确认输入密码"
        android:inputType="textPassword"/>

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:background="#7BBCFC"
        android:onClick="doRegister"
        android:text="确认注册"
        android:textColor="#fff"
        android:textSize="18sp"/>
</LinearLayout>

# Global
  - 属性:当前用户名

package example.demo0904;

public class Global
{
    public static Global i = new Global();

    public String username = "";  // 当前用户的名字
}

# MainActivity -- 主界面代码
  - 简介:重写onCreate() 加载布局文件 R.layout.activity_main

package example.demo0904;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

# User
  - 简介:Class User -- 存储用户信息
  - 属性:用户名、密码
  - 行为:构造方法

package example.demo0904;

/**
 * 存储用户的信息
 */

public class User
{
    public String username; // 用户名
    public String password; // 密码

    public User()
    {
    }
    public User(String username, String password)
    {
        this.username = username;
        this.password = password;
    }
}

# UserLoginActivity
  - 简介:Class UserLoginActivity -- 登录界面代码
  - 行为:重写onCreate()
         监听doRegister()
         监听doLogin()
         延时自动登录autoLogin
  - onCreate()
    · 布局加载 R.layout.activity_user_login
    · 配置加载 SharedPreferences [用户名,密码 自动填写]
  - autoLogin()
    · 延时1500毫秒后执行一个Runnable线程
  - doLogin()
    · 读取控件信息 [用户名 && 密码]
    · 从文件加载用户信息 
    · 查找用户
    · 对比用户密码
    · 保存当先用户信息,下次启动自动填充
    · 存放全局对象,方便所有activity使用
    · 主界面登录
    · 关闭本界面
  - doRegister()
    · 注册界面跳转

package example.demo0904;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.File;

import static example.demo0904.Global.i;

public class UserLoginActivity extends AppCompatActivity
{
    Handler msgHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_login);

        // 从配置里加载
        SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
        String username = sharedPref.getString("username", "");
        String password = sharedPref.getString("password", "");
        
        if(username.length() >0 && password.length() > 0)
        {
            // 自动填写用户名和密码
            ((EditText) findViewById(R.id.id_username)).setText(username);
            ((EditText) findViewById(R.id.id_password)).setText(password);
            // 延时N毫秒后自动登录
            autoLogin();
        }
    }

    // 延时后自动登录
    private void autoLogin()
    {
        msgHandler.postDelayed(new Runnable()
        {
            @Override
            public void run()
            {
                doLogin(null);
            }
        }, 1500); // 延时1500毫秒后执行一个Runnable线程 ( 此技术属于 《安卓高级篇》 )
    }

    // 点击 '登录' 按钮
    public void doLogin(View view)
    {
        // 取得用户界面输入
        String username = ((EditText)findViewById(R.id.id_username)).getText().toString();
        String password = ((EditText)findViewById(R.id.id_password)).getText().toString();

        // 从文件里加载所有用户的数据
        File file = new File(getExternalFilesDir(""), "users.txt");
        UserManager um = new UserManager(file);
        try{
            um.load();
        }catch (Exception e){}

        // 从用户列表里查找用户
        User u = um.find(username);
        if(u == null)
        {
            Toast.makeText(this, "无此用户!", Toast.LENGTH_SHORT).show();
            return;
        }

        // 比较密码是否区配
        if(! u.password.equals( password))
        {
            Toast.makeText(this, "密码错误!", Toast.LENGTH_SHORT).show();
            return;
        }

        // 保存当前用户信息,以便下一次开机启动时加载
        SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString("username", username);
        editor.putString("password", password);
        editor.commit();

        // 登录成功, 把用户信息放在全局对象里, 以便在各个Activity里都可以访问当前用户信息
        i.username = username;

        // 进入主界面
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();  // 注意: 关闭本界面, 从MainActivity点返回时应达到桌面, 不应回到登录界面

    }

    // 点击 '注册' 按钮
    public void doRegister(View view)
    {
        Intent intent = new Intent(this, UserRegisterActivity.class);
        startActivity(intent);
    }
}

# UserManager
  - 简介:UserManager Class
          用户信息管理
  - 属性:创建一个List来缓存User信息、数据保存到file文件中
  - 行为:构造方法,传入file文件
         保存信息到文件 save()
         加载文件信息  load()
         用户注册      add()
         用户信息查找  find()
  - save() -- 每行存储一个用户的信息,以逗号分隔
    · 打开文件流
    · 整理信息
    · 写入信息
    · 关闭文件流
  - load()
    · 打开文件流
    · 清空链表
    · 读取信息
    · 整理、存入链表
    · 关闭文件流
  - add()
    · 传入新用户信息
    · 添加至链表中
  - find()
    · 链表查询

package example.demo0904;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


public class UserManager
{
    // 创建一个List来缓存User信息
    List<User> userlist = new ArrayList();

    // 数据保存到这个文件里
    File file;

    public UserManager(File file)
    {
        this.file =file;
    }

    // 保存到文件
    public void save() throws Exception
    {
        // 每行存储一个用户的信息,以逗号分隔
        FileOutputStream fstream = new FileOutputStream(file);
        for(User u : userlist)
        {
            String line = u.username + "," + u.password + "\n";
            fstream.write( line.getBytes("UTF-8"));
        }
        fstream.close(); // 此处宜用try{} finally}{} 确保fstream被关闭
    }

    // 从文件加载
    public void load() throws Exception
    {
        InputStreamReader m = new InputStreamReader(new FileInputStream(file), "UTF-8");
        BufferedReader reader = new BufferedReader(m);

        userlist.clear(); // 先清空链表
        while(true)
        {
            String line = reader.readLine();
            if(line == null) break;

            String[] cols = line.split(",");
            if(cols.length<2) continue;

            User u = new User();
            u.username = cols[0].trim();
            u.password = cols[1].trim();
            userlist.add( u );
        }

        reader.close(); // reader关闭后,底层的inputstream会被自动关闭
    }


    // 注册一个用户
    public void add(User u)
    {
        userlist.add(u);
    }

    // 按名称查找
    public User find(String username)
    {
        for(User u: userlist)
        {
            if(u.username.equals(username))
            {
                return u;
            }
        }
        return null;
    }


}

# UserRegisterActivity
  - 简介:Class UserRegisterActivity 注册界面
  - 属性:无
  - 行为:onCreate()
         监听 doRegister
  - onCreate()
    · 加载布局文件 R.layout.activity_user_register
  - doRegister()
    · 获取用户输入
    · 判断两次密码是否一致
    · 打开文件流
    · 加载用户信息
    · 检查用户名是否已存在
    · 添加用户信息、保存文件
    · 返回登录界面

package example.demo0904;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.File;

public class UserRegisterActivity extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_register);
    }

    public void doRegister(View view)
    {
        // 取得用户的输入
        String username = ((EditText)findViewById(R.id.id_username)).getText().toString();
        String password = ((EditText)findViewById(R.id.id_password)).getText().toString();
        String verify = ((EditText)findViewById(R.id.id_verify)).getText().toString();
        if(!password.equals(verify))
        {
            Toast.makeText(this, "两次密码输入不一致!", Toast.LENGTH_SHORT).show();
            return;
        }

        // 保存用户信息
        File file = new File(getExternalFilesDir(""), "users.txt");
        UserManager um = new UserManager(file);
        try{
            um.load(); // 从users.txt中读取数据
        }catch(Exception e){}

        // 检查该用户名是否已经存在
        if( um.find( username) != null)
        {
            Toast.makeText(this, "用户名已经存在!", Toast.LENGTH_SHORT).show();
        }
        else
        {
            // 添加用户,保存到文件
            um.add(new User(username, password));
            try
            {
                um.save();
            } catch (Exception e)
            {
                e.printStackTrace();
            }
            Toast.makeText(this, "注册成功!", Toast.LENGTH_SHORT).show();

            // 返回登录界面
            finish();
        }
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值