安卓学习笔记3——登录界面UI
安卓学习笔记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、主活动
- 根据findViewById和id找到对应地控件,并将返回值根据类型向下转型,传给私有成员变量
- 写按键监听调用方法login;按键按下,获取用户名和密码,Toast提示勾选“记住密码”;将密码写入文件。
- 启动活动时,读取文件并显示
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、向外部存储写入数据:
类:Enviroment:提供获取环境变量的途径;不采用路径硬编码
static File getExternalStorageDirectory()清单文件申请权限,动态申请权限
判断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相关推荐
- 2020年安卓学习笔记目录
文章目录 一.讲课笔记 二.安卓案例 三.安卓实训项目 四.学生安卓学习博客 五.安卓课后作业 (一)界面设计练习 1.制作登录界面 2.制作部队管理界面 3.制作灭火救援界面 4.制作交付界面 5. ...
- 安卓学习笔记07:事件处理、窗口跳转与传递数据
文章目录 零.学习目标 一.三个基本控件 1.标签控件(TextView) 2.编辑框控件(EditText) 3.按钮控件(Button) 二.安卓事件处理机制 (一)安卓事件处理概述 (二)安卓事 ...
- 很low的安卓学习笔记(一、实用技巧)
很low的安卓学习笔记(一.实用技巧) 一.学习了几天的实用技巧小总结: 1.规范的定义内容的格式: 2.一些快捷键 3.将xxx.xml布局改为Activity中可以调用的View视图 4.当左下角 ...
- 安卓学习笔记之骚扰拦截
安卓学习笔记之骚扰拦截 1.监听电话状态 2.检测来电号码是否匹配拦截条件 3.若匹配,则挂断电话 实例代码: 获取TelephonyManager 对象,并监听来电状态 TelephonyManag ...
- python selenum学习笔记(一) 登录bilibil
@[TOC](python selenum学习笔记(一) 登录bilibil) 利用selenum模拟浏览器操作登录bilibili 之前学习网站内容抓取的时候,一般都是get方法,获取respons ...
- NGUI 学习笔记实战——制作商城UI界面
Unity3D的uGUI听说最近4.6即将推出,但是目前NGUI等UI插件大行其道并且已经非常成熟,所以我们还是先看眼前吧. 一.实现思想 商城的功能是很多游戏都拥有的,按下一个界面按钮,弹出一个窗体 ...
- 安卓学习笔记08:常用布局 - 线性布局
文章目录 零.学习目标 一.界面与布局概述 (一)界面 (二)布局 1.视图层次结构图 2.UI容器 (Container) 3.UI控件 (Control) 4.两种方式声明布局 二.线性布局概述 ...
- 安卓学习笔记3.1 线性布局
这里写自定义目录标题 一.导入新课 二.新课学习 (一)界面与布局 1.界面 2.布局 (1)视图层次结构图 (2)UI容器 (Container) (3)UI控件 (Control) (4)两种方式 ...
- Linux下qt注册登录,QT学习笔记:登录对话框
效果图: 用户名或密码输入错误出现 密码和用户名正确进入主界面 1.新建工程,主窗口 2.新建对话框 3.编辑登录界面 4.编辑"退出"按钮的信号与槽入上图 5.编辑"登 ...
最新文章
- 平时的你VS面试的你
- ubuntu18 搜狗输入法 解决版
- python内置函数:iter、enumerate和next
- Java live template[在此处输入文章标题]
- 蓝桥杯java第七届决赛第四题--路径之谜
- 会签是什么意思_后宫为什么要争宠·六
- query string parameters什么意思_public static void main(String[] args) 是什么意思?(转)...
- 如何衡量两个词的相关度
- gmail导入foxmail
- 【题解】SDOI2014数数
- C# 线程手册 第二章 .NET 中的线程 线程的优势
- ubuntu 11.10 下network proxy 的设置问题
- mysql fulltext类型_mysql索引类型:FULLTEXT、NORMAL、SPATIAL、UNIQUE的详细介绍(转)
- 数字图像处理与机器视觉_简单自动智能识别物体程序(机器视觉+数字图像处理)...
- Snort里如何将一个tcpdump格式的二进制文件读取打印到屏幕上(图文详解)
- int 占一个机器字长
- eclipse birt报表
- 能量换算,方便减肥控制饮食
- Android萤石云视频缩放
- sendgrid_电子邮件即服务第2部分:Sendgrid,Mailgun和邮戳