创建一个页面
1. 所有的页面都是存放在 app-res-layout 下的,所以我们在这个目录下鼠标右键-New-XML-Layout XML File
注意:布局文件命名时,不可以使用大写。
2. 点击图标可以切换不同的显示器,最常用的就是手机和平板,在这里我选择一个7寸的平板。
点击它旁边的图标,使其横屏显示
各个区域的作用:
通过底部选项卡可以在视图和xml视图之间切换,有些常用的属性设置可以在xml中快速设置。
3. 接下来先设计一个简单的登录页面吧~ 由于项目中只需要一个账号,所以直接锁定用户名,只需要输入密码就行了。
可以通过设置用户名输入框不可获得焦点的方式,使用户无法修改,具体做法如下:
找到要修改的Edittext这个控件,加入 android:focusable=“false”
4. 接下来编写视图所对应的控制器:LoginActivity
public class LoginActivity extends AppCompatActivity {
Button loginLogin, backFromLogin;
EditText loginPasswd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //固定写法
setContentView(R.layout.login); //关联视图文件 R.layout 也是固定写法,程序会自动去app/res/layout目录下寻找该文件
System.out.println("hello login");
/* 通常应用中需要经常读写的的数据文件都会保存在 /data/data/<应用包名>/files 目录下,包名可以在app/manifests/AndroidManifests.xml中找到
* 关于 openFileOutput(String name, int mode)
* 第一个参数是要读取的文件名,该方法会自动去 /data/data/<应用包名>/files/ 目录下寻找
* 第二个参数代表操作模式:
* MODE_PRIVATE 私有(只能创建它的应用访问) 重复写入时会文件覆盖
* MODE_APPEND 私有 重复写入时会在文件的末尾进行追加,而不是覆盖掉原来的文件
* MODE_WORLD_READABLE 公用 可读
* MODE_WORLD_WRITEABLE 公用 可读写
*/
File file = new File("/data/data/com.example.administrator.myapplication/files/passwd.csv");
try {
if(!file.exists()){
file.createNewFile();
OutputStream out = openFileOutput("passwd.csv", Context.MODE_PRIVATE); //MODE_PRIVATE:会覆盖原内容
openFileInput("passwd.csv");
out.write("-6542-846521-6984-57-2466-2386-2375-4856".getBytes());
out.flush();
out.close();
System.out.println("初始化密码成功");
}
} catch (IOException e) {
e.printStackTrace();
}
// 获得视图中的组件
loginLogin = findViewById(R.id.loginLogin); //R.id. 为固定写法,程序会自动去视图文件寻找相应ID的组件
backFromLogin = findViewById(R.id.backFromLogin);
loginPasswd = findViewById(R.id.loginPasswd);
// 设置登录按钮的点击事件
loginLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String passwd = loginPasswd.getText().toString();
try {
passwd = MD5.getMD5(passwd);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
InputStream input = null;
try {
input = openFileInput("passwd.csv"); //该方法会自动去应用目录中的file目录下寻找该文件
} catch (FileNotFoundException e) {
e.printStackTrace();
}
List<String> allData = CSVUtils.CSVReadAll(input); //封装了一个针对CSV文件读写操作的工具类,后面会介绍
String correntPasswd = allData.get(0);
// System.out.println("输入密码"+ passwd);
// System.out.println("正确密码"+correntPasswd);
if(correntPasswd.equals(passwd)){
// 密码输入正确,准备跳转页面,如果有 finish(),则会终止本页面跳转,否则将保留本页面,另起一个线程来打开新页面
finish();
Intent intent=new Intent(LoginActivity.this,TargetActivity.class);
startActivity(intent);
}else{
// 在页面底部弹出提示
Toast.makeText(LoginActivity.this,"密码错误",Toast.LENGTH_SHORT).show();
}
}
});
}
}
这样一个简单的页面就做好了~最后贴上MD5加解密 以及 文件读写工具类
public class MD5 {
public static String getMD5(String val) throws NoSuchAlgorithmException {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(val.getBytes());
byte[] m = md5.digest();//加密
return getString(m);
}
private static String getString(byte[] b){
StringBuffer sb = new StringBuffer();
for(int i = 0; i < b.length; i ++){
sb.append(b[i]);
}
return sb.toString();
}
}
public class CSVUtils {
public static List<String> CSVReadAll(InputStream input) {
// 可以获得全部内容的字符串,或者集合形式
List<String> data = new ArrayList<String>();
// StringBuilder sb = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = null;
while((line=reader.readLine())!=null){
data.add(line);
// sb.append(line);
// sb.append(System.getProperty("line.separator"));
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
/**
*
* 对文件的读和写的操作建议分开执行,否则读取文件会得到不正确的内容,使用openFileOutput() 会影响正常的读取操作
* 返回修改后的全部内容,接下来需要将这些内容重写回该文件
*/
public static String modifyCSV(FileInputStream in, String oldStr, String replaceStr){
StringBuffer buf = null;
String temp = "";
try {
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
buf = new StringBuffer();
// 保存前面的内容
while ((temp = br.readLine()) != null && !(temp.startsWith(oldStr))) {
buf = buf.append(temp);
buf = buf.append(System.getProperty("line.separator"));
}
// 找到要替换的数据,并替换
System.out.println("将要被替换的数据:"+temp);
String temp1 = temp.replace(temp,replaceStr);
buf = buf.append(temp1);
buf = buf.append(System.getProperty("line.separator"));
// 保存后面的内容
while ((temp = br.readLine()) != null) {
buf = buf.append(temp);
buf = buf.append(System.getProperty("line.separator"));
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
// 返回更新后的全部数据
return buf.toString();
}
}
----------------------------------------------------------------------------------------------------------------------------
参考文章:
https://blog.youkuaiyun.com/chenzheng_java/article/details/6214261