• android学习笔记----模拟登陆界面(文件和SharedPreferences存储)


    记录学习笔记:

    目录

    1.SharedPreferences存储

    2.文件存储:


    SharedPreferences存储源码(QQlogin2):https://github.com/liuchenyang0515/QQlogin2

    文件存储源码(QQlogin):https://github.com/liuchenyang0515/QQlogin


    1.SharedPreferences存储

    界面如下:

    MainActivity.java

    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        /**
         * 定义一个共享参数(存放数据方便的api)
         */
        private SharedPreferences sp;
        private String TAG = "MainActivity";
        private EditText et_qqnumber;
        private EditText et_passwd;
        private CheckBox cb_remember;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            et_qqnumber = (EditText) findViewById(R.id.et_qqnumber);
            et_passwd = (EditText) findViewById(R.id.et_passwd);
            cb_remember = (CheckBox) findViewById(R.id.cb_remember);
            sp = this.getSharedPreferences("config", MODE_PRIVATE);
            restoreInfo();
        }
    
        /**
         * 根据原来保存的文件信息,把QQ号码和密码信息显示到界面
         */
        private void restoreInfo() {
            String qq = sp.getString("qq", "");
            String passwd = sp.getString("passwd", "");
            boolean isRemember = sp.getBoolean("remember", false);
            Log.d(TAG, "qq:" + qq);
            Log.d(TAG, "passwd:" + passwd);
            et_qqnumber.setText(qq);
            et_passwd.setText(passwd);
            cb_remember.setChecked(isRemember); // 恢复时也把记住密码的勾选上
        }
    
        /**
         * 登录按钮的点击事件
         *
         * @param view
         */
        public void login(View view) {
            String qq = et_qqnumber.getText().toString().trim();
            String passwd = et_passwd.getText().toString().trim();
            if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(passwd)) {
                Toast.makeText(this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
                return;
            } else {
                // 登录操作,模拟登陆,数据应该提交给服务器比较是否正确
                if ("10000".equals(qq) && "123456".equals(passwd)) {
                    // 是否需要记住密码
                    // 将数据保存到sp文件中
                    SharedPreferences.Editor edit = sp.edit();
                    if (cb_remember.isChecked()) {
                        edit.putString("qq", qq);
                        edit.putString("passwd", passwd);
                        edit.putBoolean("remember", true);
                    } else {
                        edit.clear(); // 没有勾选记住密码就清空SharedPreferences文件数据
                    }
                    edit.apply(); // 提交数据,类似于关闭流,事务
                    Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "登陆失败", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

    xml文件参考如下:

    <?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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:srcCompat="@drawable/qq" />
    
        <EditText
            android:id="@+id/et_qqnumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="请输入QQ号码"
            android:inputType="number"
            android:selectAllOnFocus="false" />
    
        <EditText
            android:id="@+id/et_passwd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="请输入QQ密码"
            android:inputType="textPassword" />
    
        <CheckBox
            android:id="@+id/cb_remember"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="记住密码" />
    
        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="login"
            android:text="登录" />
    
    </LinearLayout>

    存储config.xml如下:

    ====================================================================


    2.文件存储:

    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    
    public class MainActivity extends AppCompatActivity {
    
        private EditText et_qqnumber;
        private EditText et_passwd;
        private CheckBox cb_remember;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            et_qqnumber = (EditText) findViewById(R.id.et_qqnumber);
            et_passwd = (EditText) findViewById(R.id.et_passwd);
            cb_remember = (CheckBox) findViewById(R.id.cb_remember);
            restoreInfo();
        }
    
        /**
         * 根据原来保存的文件信息,把QQ号码和密码信息显示到界面
         */
        private void restoreInfo() {
            // File file = new File(this.getFilesDir(), "info.txt");
            // 用openFileInput就不需要判断file.exists() && file.length() > 0了
            // 函数封装会处理的
            // 自动关流写法要jdk1.7及以上
            try (//FileInputStream fis = new FileInputStream(file);
                 FileInputStream fis = openFileInput("info.txt");
                 BufferedReader br = new BufferedReader(new InputStreamReader(fis));) {
                String line = br.readLine();
                if (line != null){
                    String[] info = line.split("##");
                    String qq = info[0];
                    String pwd = info[1];
                    et_qqnumber.setText(qq);
                    et_qqnumber.setSelection(qq.length());
                    et_passwd.setText(pwd);
                    cb_remember.setChecked(true);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 登录按钮的点击事件
         *
         * @param view
         */
        public void login(View view) {
            String qq = et_qqnumber.getText().toString().trim();
            String passwd = et_passwd.getText().toString().trim();
            if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(passwd)) {
                Toast.makeText(this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
                return;
            } else {
                // 是否需要记住密码
                try (
                        //FileOutputStream fos = new FileOutputStream(new File(this.getFilesDir(), "info.txt"));
                        FileOutputStream fos = openFileOutput("info.txt", MODE_PRIVATE);
                        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos));) {
                    // 登录操作,模拟登陆,数据应该提交给服务器比较是否正确
                    if ("10000".equals(qq) && "123456".equals(passwd)) {
                        Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
                        if (cb_remember.isChecked()) {
                            // 被选中状态,需要记住密码
                            String info = qq + "##" + passwd;
                            //fos.write(info.getBytes());
                            writer.write(info);
                        } else {
                            writer.write(""); // 空文件
                        }
                    } else {
                        Toast.makeText(this, "登陆失败", Toast.LENGTH_SHORT).show();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    笔记批注:如果想要修改文件的权限的话,可以进入到相应的目录,然后例如:chmod 777 private.txt就可以把权限改为

    -rwxrwxrwx,每一个权限组都是3位2进制数。


    ========================================Talk is cheap, show me the code=======================================

    CSDN博客地址:https://blog.csdn.net/qq_34115899
  • 相关阅读:
    <数据结构基础学习>(四)链表 Part 2
    <Android基础> (四) Fragment Part 2
    swagger忽略方法里参数的方法
    ActiveMq
    Tomcat日志归档
    java代理的实现
    包装类型和基础类型是如何比较的
    hashmap
    可达性分析中,可以作为GcRoots的对象
    使用Navicat 连接oracle出现 “ORA-03135: Connection Lost Contact”
  • 原文地址:https://www.cnblogs.com/lcy0515/p/10807936.html
Copyright © 2020-2023  润新知