登录界面的记住密码功能

作者: 亚欧沙龙 | 来源:发表于2018-03-09 11:02 被阅读50次

    登录界面的记住密码功能

    先上布局代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <include layout="@layout/login_title"/>
    
    <LinearLayout
       android:orientation="horizontal"
       android:layout_width="match_parent"
       android:layout_height="40dp">
    </LinearLayout>
    
    <RelativeLayout
       android:layout_width="match_parent"
       android:layout_height="100dp"
       android:background="@drawable/shape_1">
       <!--该开源项目是用来轻松实现图片圆形化的共能-->
       <de.hdodenhof.circleimageview.CircleImageView
           android:id="@+id/icon_image"
           android:layout_width="100dp"
           android:layout_height="100dp"
           android:layout_alignParentLeft="true"
           android:layout_alignParentStart="true"
           android:layout_alignParentTop="true"
           android:layout_marginLeft="57dp"
           android:layout_marginStart="57dp"
           android:src="@drawable/img_x" />
    
       <ImageView
           android:id="@+id/edit_view"
           android:layout_width="25dp"
           android:layout_height="25dp"
           android:layout_alignParentTop="true"
           android:layout_toLeftOf="@+id/take_picture"
           android:layout_toStartOf="@+id/take_picture"
           android:src="@drawable/ic_stay_primary_portrait_black_24dp" />
    
       <Button
           android:id="@+id/take_picture"
           android:layout_width="wrap_content"
           android:layout_height="40dp"
           android:layout_alignParentEnd="true"
           android:layout_alignParentRight="true"
           android:layout_alignParentTop="true"
           android:layout_marginEnd="17dp"
           android:layout_marginRight="17dp"
           android:text="点击拍照切换头像"
           android:textSize="10sp" />
    
       <ImageView
           android:id="@+id/take_form_album"
           android:layout_width="25dp"
           android:layout_height="25dp"
           android:layout_below="@+id/take_picture"
           android:layout_marginTop="12dp"
           android:layout_toLeftOf="@+id/take_picture"
           android:layout_toStartOf="@+id/take_picture"
           android:src="@drawable/ic_picture"/>
    
       <Button
           android:id="@+id/take_album"
           android:layout_width="wrap_content"
           android:layout_height="40dp"
           android:layout_toRightOf="@+id/take_form_album"
           android:layout_below="@+id/take_picture"
           android:text="相册选择头像"
           android:textSize="10sp" />
    </RelativeLayout>
    
    
    <LinearLayout
       android:orientation="horizontal"
       android:layout_width="match_parent"
       android:layout_height="40dp"
       android:background="#fff">
    </LinearLayout>
    
    <LinearLayout
       android:orientation="horizontal"
       android:layout_width="match_parent"
       android:layout_height="60dp">
    
       <TextView
           android:layout_width="90dp"
           android:layout_height="wrap_content"
           android:textSize="18sp"
           android:layout_gravity="center_vertical"
           android:text="Username:"/>
       <EditText
           android:id="@+id/username"
           android:layout_width="0dp"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:layout_gravity="center_vertical"/>
    
    </LinearLayout>
    
    <LinearLayout
       android:orientation="horizontal"
       android:layout_width="match_parent"
       android:layout_height="60dp">
    
       <TextView
           android:layout_width="90dp"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:text="Email:"
           android:textSize="18sp" />
    
       <EditText
           android:id="@+id/mail"
           android:layout_width="0dp"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:layout_gravity="center_vertical"/>
       <ImageView
           android:id="@+id/mail_Visibility"
           android:layout_width="40dp"
           android:layout_height="40dp"
           android:src="@drawable/ic_visibility" />
    </LinearLayout>
    <LinearLayout
       android:orientation="horizontal"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
    
       <CheckBox
           android:id="@+id/remember_password"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content" />
       <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textSize="18sp"
           android:textStyle="bold"
           android:text="Remember password"/>
    </LinearLayout>
    
    <LinearLayout
       android:orientation="horizontal"
       android:layout_width="match_parent"
       android:layout_height="30dp">
    </LinearLayout>
    <Button
       android:id="@+id/login"
       android:layout_width="match_parent"
       android:layout_height="60dp"
       android:background="@drawable/shape"
       android:text="Login"
       android:textAllCaps="false"
       android:textColor="#0f0e0e"
       android:textSize="18sp"
       android:textStyle="bold" />
    </LinearLayout>
    

    效果就如下:

    image.png

    至于逻辑,及先在onCreate()方法中获取sharedPreferences对象,

    //通过SharedPreferences储存实现记住密码功能

        private SharedPreferences pref;
     //获取了SharePreferences对象
            pref = PreferenceManager.getDefaultSharedPreferences(this);
    

    然后调用它的getBoolean()方法去获取remember_password这个键值,调用SharePreferences的getBoolean()方法获取remember_password这个键值,一开始默认的为false

    
            boolean isRemember = pref.getBoolean("remember_password",false);
            if (isRemember){
                //将账号和密码都设置文本框中
                String username = pref.getString("username","");
                String email = pref.getString("mail","");
                usernameEdit.setText(username);
                emailEdit.setText(email);
                //将CheckBox状态设置为勾选
                rememberPass.setChecked(true);
            }
    
    ase R.id.login:
                    String username = usernameEdit.getText().toString();
                    String email = emailEdit.getText().toString();
                    editor = pref.edit();
    

    接着在登陆成功之后,会调用CheckBox的isChecked()方法来检查复选框是否被选中,

                    //检查复选框是否被选中
                    if (rememberPass.isChecked()){
    

    如果被选中的话,只是将remember_password设置为true,然后吧username和email对应的只都存入到sharedPreferences文件中并提交, 如果没有被选中,就简单的调用一下clear()方法,将sharedPreferences文件中的数据清除掉就可以了

                        editor.putBoolean("remember_password",true);
                        editor.putString("username",username);
                        editor.putString("mail",email);
                    }else {
                        editor.clear();
                    }
                    editor.apply();
    
                Intent intent = new Intent();
                intent.putExtra("username_return",username);
                intent.putExtra("email_return",email);
                setResult(RESULT_OK,intent);
                finish();
                break;
    

    整体的逻辑代码

    package com.example.lab.android.nuc.materialtest.Activity;
    
    import android.Manifest;
    import android.annotation.TargetApi;
    import android.content.ContentUris;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.pm.PackageManager;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.BitmapDrawable;
    import android.media.Image;
    import android.net.Uri;
    import android.os.Build;
    import android.preference.PreferenceManager;
    import android.provider.DocumentsContract;
    import android.provider.MediaStore;
    import android.support.annotation.NonNull;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v4.content.FileProvider;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.RecyclerView;
    import android.text.TextUtils;
    import android.text.method.HideReturnsTransformationMethod;
    import android.text.method.PasswordTransformationMethod;
    import android.view.Gravity;
    import android.view.View;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.PopupMenu;
    import android.widget.PopupWindow;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.widget.ToggleButton;
    
    import com.example.lab.android.nuc.materialtest.R;
    
    import org.w3c.dom.Text;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    import de.hdodenhof.circleimageview.CircleImageView;
    
    public class LoginActivity extends AppCompatActivity implements View.OnClickListener{
    
        //调用摄像头选择头像
        private static final int TAKE_PHOTO = 1;
    
        //调用相册进行选择头像
        private static final int CHOOSE_PHOTO = 2;
    
        private PopupWindow popupWindow;
    
        private View popupView;
    
    
        private CircleImageView circleImageView;
        //创建Uri对象
        private Uri imageUri;
    
        //调用摄像头选择头像
        private Button take_picture;
        //调用相册进行选择头像
        private Button take_album;
    
        private static int FLAG = 1;
    
        private EditText usernameEdit;
        private EditText emailEdit;
    
        private Button titleButton;
        private Button homeButton;
        private Button loginButton;
    
    
        private TextView usernameText;
        private TextView emailText;
    
        private ImageView show_password;
        private CheckBox rememberPass;
    
        //通过SharedPreferences储存实现记住密码功能
        private SharedPreferences pref;
    
        private SharedPreferences.Editor editor;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
    
            //调用摄像头选择头像
            take_picture = (Button) findViewById(R.id.take_picture);
            //调用相册进行选择头像
            take_album = (Button) findViewById(R.id.take_album);
    
            usernameText = (TextView) findViewById(R.id.username);
            emailText = (TextView) findViewById(R.id.mail);
    
            //获取了SharePreferences对象
            pref = PreferenceManager.getDefaultSharedPreferences(this);
    
            usernameEdit = (EditText) findViewById(R.id.username);
            emailEdit = (EditText) findViewById(R.id.mail);
    
            circleImageView = (CircleImageView) findViewById(R.id.icon_image);
            show_password = (ImageView) findViewById(R.id.mail_Visibility);
            rememberPass = (CheckBox) findViewById(R.id.remember_password);
            titleButton = (Button) findViewById(R.id.title_back_1);
            homeButton = (Button) findViewById(R.id.title_home);
            loginButton = (Button) findViewById(R.id.login);
            titleButton.setOnClickListener(this);
            homeButton.setOnClickListener(this);
            loginButton.setOnClickListener(this);
            show_password.setOnClickListener(this);
            take_picture.setOnClickListener(this);
            take_album.setOnClickListener(this);
    
    //        if ()
    
            //调用SharePreferences的getBoolean()方法获取remember_password这个键值,一开始默认的为false
            boolean isRemember = pref.getBoolean("remember_password",false);
            if (isRemember){
                //将账号和密码都设置文本框中
                String username = pref.getString("username","");
                String email = pref.getString("mail","");
                usernameEdit.setText(username);
                emailEdit.setText(email);
                //将CheckBox状态设置为勾选
                rememberPass.setChecked(true);
            }
    
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.title_back_1:
                    finish();
                    break;
                case R.id.title_home:
    
                    break;
                case R.id.login:
                    String username = usernameEdit.getText().toString();
                    String email = emailEdit.getText().toString();
                    editor = pref.edit();
                    //检查复选框是否被选中
                    if (rememberPass.isChecked()){
                        editor.putBoolean("remember_password",true);
                        editor.putString("username",username);
                        editor.putString("mail",email);
                    }else {
                        editor.clear();
                    }
                    editor.apply();
                    Intent intent = new Intent();
                    intent.putExtra("username_return",username);
                    intent.putExtra("email_return",email);
                    setResult(RESULT_OK,intent);
                    finish();
                    break;
                case R.id.mail_Visibility:
                    if (FLAG == 1) {
                        show_password.setImageResource(R.drawable.ic_visibility_off);
                        FLAG = 0;
                        //显示账户和邮箱
                        usernameText.setTransformationMethod(PasswordTransformationMethod.getInstance());
                        emailText.setTransformationMethod(PasswordTransformationMethod.getInstance());
                    } else {
                        show_password.setImageResource(R.drawable.ic_visibility);
                        FLAG = 1;
                        //隐藏账户和邮箱
                        usernameText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                        emailText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                    }
                    break;
                case R.id.take_picture:
                    //创建File对象,用于储存拍照后的照片
                    //getExternalCacheDir()用于得到该照片当前缓存的位置
                    File outputImage = new File(getExternalCacheDir(),"take_image.jpg");
                    try{
                        if (outputImage.exists()){
                            outputImage.delete();
                        }
                        outputImage.createNewFile();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                    //如果Android版本高于7.0
                    if (Build.VERSION.SDK_INT >= 24){
                        //调用FileProvider的getUriForFile()方法将照片解析成Uri对象
                        imageUri = FileProvider.getUriForFile(LoginActivity.this,
                                "com.example.lab.android.nuc.materialtest",outputImage);
                    }else {
                        imageUri = Uri.fromFile(outputImage);
                    }
    
                    //启动相机程序
                    Intent intent_1 = new Intent("android.media.action.IMAGE_CAPTURE");
                    intent_1.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
                    startActivityForResult(intent_1,TAKE_PHOTO);
                    break;
                case R.id.take_album:
                    //申请储存权限
                    if (ContextCompat.checkSelfPermission(LoginActivity.this,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                        ActivityCompat.requestPermissions(LoginActivity.this,new String[]{
                                Manifest.permission.WRITE_EXTERNAL_STORAGE
                        },2);
                    }else{
                        openAlbum();
                    }
                    break;
                default:
            }
        }
    
        //通过储存的授权打开相册
        private void openAlbum(){
            //使用Intent调用储存权限
            Intent intent_2 = new Intent("android.intent.action.GET_CONTENT");
            intent_2.setType("image/*");
            startActivityForResult(intent_2,CHOOSE_PHOTO);//打开相册
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode){
                case 2:
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                        openAlbum();
                    }else {
                        Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                    }
                    break;
                default:
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            switch (requestCode){
    
                //调用相机拍照片作为头像
    
                case TAKE_PHOTO:
                    if (resultCode == RESULT_OK){
                        try{
                            //将照片显示出来
                            Bitmap bitmap_1 = BitmapFactory.decodeStream(getContentResolver().
                                    openInputStream(imageUri));
                            circleImageView.setImageBitmap(bitmap_1);
                        }catch (FileNotFoundException e){
                            e.printStackTrace();
                        }
                    }
                    break;
    
                //调用相册选择合适的照片作为头像
    
                case CHOOSE_PHOTO:
                    if (resultCode == RESULT_OK){
                        //判断手机版本号
                        if (Build.VERSION.SDK_INT >= 19){
                            //4.4版本以上的使用下面的方法进行处理
                            handleImageOnKitKat(data);
                        }else {
                            //4.4版本以下的使用下面的方法进行处理
                            handleImageBeforeKitkat(data);
                        }
                    }
                    break;
                default:
                    break;
            }
        }
    
        //4.4版本以上,选择相册中的图片不在返回图片真是的Uri了
        @TargetApi(19)
        private void handleImageOnKitKat(Intent data){
            String imagePath = null;
            Uri uri = data.getData();
            if (DocumentsContract.isDocumentUri(this,uri)){
                //如果是Document类型的Uri,则通过document id 进行处理
                String docId = DocumentsContract.getDocumentId(uri);
                if ("com.android.providers.media.documents".equals(uri.getAuthority())){
                    String id = docId.split(":")[1];//解析出数字格式的id
                    String selection = MediaStore.Images.Media._ID + "=" + id;
                    imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
                }else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())){
                    Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));
                    imagePath = getImagePath(contentUri,null);
                }
            }else if ("content".equalsIgnoreCase(uri.getScheme())){
    
                //如果是content类型的Uri,则使用普通方式处理
                imagePath = getImagePath(uri,null);
            }else if ("file".equalsIgnoreCase(uri.getScheme())){
    
                //如果是file类型的Uri,直接获取图片路径即可
                imagePath = uri.getPath();
            }
            displayImage(imagePath);
        }
    
        //4.4版本以下的,选择相册的图片返回真实的Uri
        private void handleImageBeforeKitkat(Intent data){
            Uri uri = data.getData();
            String imagePath = getImagePath(uri,null);
            displayImage(imagePath);
        }
    
    
        private String getImagePath(Uri uri,String selection){
            String path = null;
            //通过Uri和selection来获取真实的图片路径
            Cursor cursor = getContentResolver().query(uri,null,selection,null,null);
            if (cursor != null){
                //如果是从第一个开始查起的
                if (cursor.moveToFirst()){
                    //获取储存下的所有图片
                    path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                }
                //关闭查找
                cursor.close();
            }
            //返回路径
            return path;
        }
    
        //该方法将图片显示出来
        private void displayImage(String Imagepath){
            if (Imagepath != null){
                //利用BitmapFactory的decodeFile()方法解析图片
                Bitmap bitmap_2 = BitmapFactory.decodeFile(Imagepath);
                circleImageView.setImageBitmap(bitmap_2);
            }else{
                Toast.makeText(this, "failed to find imagePath", Toast.LENGTH_SHORT).show();
            }
        }
    }
    
    

    接下来我们看一下密码的隐藏跟显示功能

    隐藏EditText1

    editText1.setTransformationMethod(HideReturnsTransformationMethod.getInstance());

    显示EditText1

    editText1.setTransformationMethod(PasswordTransformationMethod.getInstance());

    image

    效果如下:

    image.png image.png

    具体的项目可以访问我的GIthub及刚写的一个未完成的项目

    相关文章

      网友评论

        本文标题:登录界面的记住密码功能

        本文链接:https://www.haomeiwen.com/subject/oqrpfftx.html