安卓学习笔记3——登录界面UI

  • 一、登录界面UI
    • 1、根据需求写UI
    • 2、主活动
    • 3、主活动调用的读写文件的工具类
    • 4、效果展示
  • 二、总结与改进
    • 不足:
      • 1、密码分割采用字符串:当密码和用户名包含该字符串时,无法分割
      • 2、文件路径是绝对路径:
      • 3、向外部存储写入数据:

一、登录界面UI

注:只做UI不做服务器后端,使用android studio3.5

1、根据需求写UI

  • 采用线性布局内嵌相对布局
  • 线性布局垂直排列
  • 内部控件一共四个:edittext2个,Button一个,checkbox一个
  • 正常为控件设置宽高、文本、文本大小(dp和sp的区别)
  • password文本框,使用inputType属性显示密文
  • button设置onclick属性,按键事件监听可调起方法login
<?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"tools:context=".MainActivity"android:orientation="vertical"><EditTextandroid:id="@+id/user_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入用户名"android:textSize="25dp"/><EditTextandroid:id="@+id/password"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入密码"android:inputType="textPassword"android:textSize="25dp"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="20dp"><CheckBoxandroid:id="@+id/checkbox"android:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="记住用户名和密码"/><Buttonandroid:onClick="login"android:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录"android:layout_alignParentRight="true"android:layout_marginRight="20dp"android:textSize="25dp"/></RelativeLayout>
</LinearLayout>

2、主活动

  1. 根据findViewById和id找到对应地控件,并将返回值根据类型向下转型,传给私有成员变量
  2. 写按键监听调用方法login;按键按下,获取用户名和密码,Toast提示勾选“记住密码”;将密码写入文件。
  3. 启动活动时,读取文件并显示
package com.example.loginui;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;import java.io.File;
import java.util.Map;public class MainActivity extends AppCompatActivity {private EditText et_username;private Button bt;private EditText et_password ;private CheckBox checkBox;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_username=(EditText) findViewById(R.id.user_name);bt =(Button) findViewById(R.id.button1);et_password = (EditText) findViewById(R.id.password);checkBox=(CheckBox) findViewById(R.id.checkbox);Map<String,String> maps=saveInfoUtils.readInfo();if (maps!=null){String name=maps.get("name");String pwd=maps.get("pwd");et_username.setText(name);et_password.setText(pwd);}}public void login(View view){String name=et_username.getText().toString().trim();String pass=et_password.getText().toString().trim();if (TextUtils.isEmpty(name)||TextUtils.isEmpty(pass) ){Toast.makeText(MainActivity.this,"用户名或密码不能为空",Toast.LENGTH_SHORT).show();}else{if(checkBox.isChecked()){//                存密码if(!saveInfoUtils.saveInfo(name,pass)){System.out.println("密码保存失败");}System.out.println("开始登录");}else{Toast.makeText(MainActivity.this,"请勾选记住密码",Toast.LENGTH_SHORT).show();}}}
}

3、主活动调用的读写文件的工具类

saveInfoUtils.java
使用java IO操作,记得catch 异常

  • 写入文件:文件输出流fos.write(str.getBytes())
  • 读取文件:BufferedReader buf=new BufferedReader(new InputStreamReader(fis))
package com.example.loginui;import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;public class saveInfoUtils {public static boolean saveInfo(String user,String pwd){try{String str=user+","+pwd;File file=new File("data/data/com.example.loginui/userinfo.txt");FileOutputStream fos=new FileOutputStream(file);fos.write(str.getBytes());fos.close();return  true;}catch(Exception ex){ex.printStackTrace();return false;}}public static Map<String,String> readInfo(){Map<String,String> maps=new HashMap<String,String>();try{File file=new File("data/data/com.example.loginui/userinfo.txt");FileInputStream fis=new FileInputStream(file);BufferedReader buf=new BufferedReader(new InputStreamReader(fis));String[] content=buf.readLine().split(",");maps.put("name",content[0]);maps.put("pwd",content[1]);fis.close();return maps;}catch(Exception ex){ex.printStackTrace();return null;}
}
}

4、效果展示


二、总结与改进

不足:

1、密码分割采用字符串:当密码和用户名包含该字符串时,无法分割

  • 使用SharedPreferences 接口完成配置信息存取

code
写入配置文件

                SharedPreferences sp=getSharedPreferences("config",0);SharedPreferences.Editor editor=sp.edit();editor.putString("name",name);editor.putString("pwd",pass);editor.commit();

读取配置文件

        SharedPreferences config=getSharedPreferences("config",0);et_username.setText(config.getString("name",""));//前面为key,后面为默认值et_password.setText(config.getString("pwd",""));

效果:可以添加任意字符

  • 使用SharedPreferences 记录复选框的勾选状态

code

SharedPreferences config=getSharedPreferences("config",0);et_username.setText(config.getString("name",""));et_password.setText(config.getString("pwd",""));checkBox.setChecked(config.getBoolean("ischeck",false));
SharedPreferences sp=getSharedPreferences("config",0);SharedPreferences.Editor editor=sp.edit();editor.putString("name",name);editor.putString("pwd",pass);
//                存复选框状态editor.putBoolean("ischeck",true);editor.commit();

2、文件路径是绝对路径:

文件路径和读写操作可采用content的方法

  • 通过content.openFileOutput()获取文件输出流,
  • 通过content.openFileInput()获取文件输入流,
  • 这种情况会自动在app目录下创建files文件夹,代码简化,逻辑更佳

saveInfo1方法

    public static boolean saveInfo1(Context context,String user, String pwd){try{//            String path=context.getFilesDir().getPath();String str=user+","+pwd;
//            File file=new File(path,"info.txt");
//            FileOutputStream fos=new FileOutputStream(file);FileOutputStream fos=context.openFileOutput("info.txt",0);fos.write(str.getBytes());fos.close();return  true;}catch(Exception ex){ex.printStackTrace();return false;}}

readInfo1方法

 public static Map<String,String> readInfo1(Context context){Map<String,String> maps=new HashMap<>();try{//            String path=context.getFilesDir().getPath();
//            File file=new File(path,"info.txt");
//            FileInputStream fis=new FileInputStream(file);FileInputStream fis= context.openFileInput("info.txt");BufferedReader buf=new BufferedReader(new InputStreamReader(fis));String[] content=buf.readLine().split(",");maps.put("name",content[0]);maps.put("pwd",content[1]);fis.close();return maps;}catch(Exception ex){ex.printStackTrace();return null;}}

3、向外部存储写入数据:

  1. 类:Enviroment:提供获取环境变量的途径;不采用路径硬编码
    static File getExternalStorageDirectory()

  2. 清单文件申请权限,动态申请权限

  3. 判断SD卡是否可用

    code

清单文件

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

新增动态获取权限:

Toast.makeText(MainActivity.this,"权限不足",Toast.LENGTH_SHORT).show();int REQUEST_EXTERNAL_STORAGE = 1;String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};int permission = ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);if(permission!= PackageManager.PERMISSION_GRANTED) {// We don't have permission so prompt the userActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE

判断sd卡是否可用:

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()){//sd卡已挂载
}

安卓学习笔记3——登录界面UI相关推荐

  1. 2020年安卓学习笔记目录

    文章目录 一.讲课笔记 二.安卓案例 三.安卓实训项目 四.学生安卓学习博客 五.安卓课后作业 (一)界面设计练习 1.制作登录界面 2.制作部队管理界面 3.制作灭火救援界面 4.制作交付界面 5. ...

  2. 安卓学习笔记07:事件处理、窗口跳转与传递数据

    文章目录 零.学习目标 一.三个基本控件 1.标签控件(TextView) 2.编辑框控件(EditText) 3.按钮控件(Button) 二.安卓事件处理机制 (一)安卓事件处理概述 (二)安卓事 ...

  3. 很low的安卓学习笔记(一、实用技巧)

    很low的安卓学习笔记(一.实用技巧) 一.学习了几天的实用技巧小总结: 1.规范的定义内容的格式: 2.一些快捷键 3.将xxx.xml布局改为Activity中可以调用的View视图 4.当左下角 ...

  4. 安卓学习笔记之骚扰拦截

    安卓学习笔记之骚扰拦截 1.监听电话状态 2.检测来电号码是否匹配拦截条件 3.若匹配,则挂断电话 实例代码: 获取TelephonyManager 对象,并监听来电状态 TelephonyManag ...

  5. python selenum学习笔记(一) 登录bilibil

    @[TOC](python selenum学习笔记(一) 登录bilibil) 利用selenum模拟浏览器操作登录bilibili 之前学习网站内容抓取的时候,一般都是get方法,获取respons ...

  6. NGUI 学习笔记实战——制作商城UI界面

    Unity3D的uGUI听说最近4.6即将推出,但是目前NGUI等UI插件大行其道并且已经非常成熟,所以我们还是先看眼前吧. 一.实现思想 商城的功能是很多游戏都拥有的,按下一个界面按钮,弹出一个窗体 ...

  7. 安卓学习笔记08:常用布局 - 线性布局

    文章目录 零.学习目标 一.界面与布局概述 (一)界面 (二)布局 1.视图层次结构图 2.UI容器 (Container) 3.UI控件 (Control) 4.两种方式声明布局 二.线性布局概述 ...

  8. 安卓学习笔记3.1 线性布局

    这里写自定义目录标题 一.导入新课 二.新课学习 (一)界面与布局 1.界面 2.布局 (1)视图层次结构图 (2)UI容器 (Container) (3)UI控件 (Control) (4)两种方式 ...

  9. Linux下qt注册登录,QT学习笔记:登录对话框

    效果图: 用户名或密码输入错误出现 密码和用户名正确进入主界面 1.新建工程,主窗口 2.新建对话框 3.编辑登录界面 4.编辑"退出"按钮的信号与槽入上图 5.编辑"登 ...

最新文章

  1. 平时的你VS面试的你
  2. ubuntu18 搜狗输入法 解决版
  3. python内置函数:iter、enumerate和next
  4. Java live template[在此处输入文章标题]
  5. 蓝桥杯java第七届决赛第四题--路径之谜
  6. 会签是什么意思_后宫为什么要争宠·六
  7. query string parameters什么意思_public static void main(String[] args) 是什么意思?(转)...
  8. 如何衡量两个词的相关度
  9. gmail导入foxmail
  10. 【题解】SDOI2014数数
  11. C# 线程手册 第二章 .NET 中的线程 线程的优势
  12. ubuntu 11.10 下network proxy 的设置问题
  13. mysql fulltext类型_mysql索引类型:FULLTEXT、NORMAL、SPATIAL、UNIQUE的详细介绍(转)
  14. 数字图像处理与机器视觉_简单自动智能识别物体程序(机器视觉+数字图像处理)...
  15. Snort里如何将一个tcpdump格式的二进制文件读取打印到屏幕上(图文详解)
  16. int 占一个机器字长
  17. eclipse birt报表
  18. 能量换算,方便减肥控制饮食
  19. Android萤石云视频缩放
  20. sendgrid_电子邮件即服务第2部分:Sendgrid,Mailgun和邮戳

热门文章

  1. 多变量对因变量贡献率分析-基于黄河中游输沙变化影响因素的nature文章
  2. win10链接无线打印服务器,大师给您说win10系统连接惠普6960无线打印机的解决门径...
  3. Excel如何把身份证号码升级到18位
  4. KMS激活时,常见的错误及处理
  5. Epson 打印机设置
  6. Android NFC 使用MifareUltralight读写数据
  7. 一物一码平台如何解决企业窜货问题?
  8. 跨域问题的4种解决方案
  9. C语言扫雷(附标记展开功能)
  10. 肿瘤 材料 计算机模拟,射频加热治疗肿瘤体模实验的数值模拟.pdf