移动端(Android)登录逻辑实现

在实际开发中,我们经常会处理登录的相关逻辑,先上登录界面吧:

我想要做的效果是,输入用户名后监听弹出全删按钮,在键盘上点击下一步可从用户名到密码栏。

以下是界面布局文件:

<?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"
    android:background="@mipmap/index_bg"
    >

    <LinearLayout
        android:layout_marginTop="260dp"
        android:layout_marginLeft="@dimen/default_margin_50dp"
        android:layout_marginRight="@dimen/default_margin_50dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/transparent"
        android:orientation="vertical"
        >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/default_margin_40dp"
            >

            <ImageView
                android:id="@+id/iv_username"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/name_s"
                android:layout_centerVertical="true"
                />

            <EditText
                android:id="@+id/et_username"
                android:layout_marginLeft="@dimen/default_margin_40dp"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:imeOptions="actionNext"
                android:nextFocusForward="@+id/et_password"
                style="@style/telephone_style"
                />

            <ImageView
                android:clickable="true"
                android:focusable="true"
                android:layout_alignParentRight="true"
                android:layout_marginRight="@dimen/default_margin_10dp"
                android:id="@+id/iv_username_delete"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/clear_search_content_icon"
                android:layout_centerVertical="true"
                />

        </RelativeLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="0.5dp"
            android:background="@color/color_DDDDDD"/>

        <RelativeLayout
            android:layout_marginTop="@dimen/default_margin_20dp"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:background="@color/transparent">

            <ImageView
                android:id="@+id/iv_key"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/key_s"
                android:layout_centerVertical="true"
                />

            <EditText
                android:layout_marginLeft="@dimen/default_margin_40dp"
                android:id="@+id/et_password"
                style="@style/et_password"
                />

            <ImageView
                android:clickable="true"
                android:focusable="true"
                android:id="@+id/iv_password_delete"
                style="@style/delete_img_style"/>

        </RelativeLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="0.5dp"
            android:background="@color/color_DDDDDD"/>

    </LinearLayout>

    <Button
        android:id="@+id/btn_login"
        android:layout_marginTop="@dimen/default_margin_60dp"
        android:layout_marginLeft="@dimen/default_margin_50dp"
        android:layout_marginRight="@dimen/default_margin_50dp"
        android:layout_width="match_parent"
        android:layout_height="@dimen/default_margin_60dp"
        android:textColor="@color/white"
        android:textSize="@dimen/default_text_size_20sp"
        android:background="@mipmap/denglu"
    />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageButton
            android:id="@+id/ib_setting"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_width="@dimen/default_margin_50dp"
            android:layout_height="@dimen/default_margin_50dp"
            android:src="@mipmap/setting"
            android:scaleType="center"
            android:background="#666666"
            />

    </RelativeLayout>

</LinearLayout>

以下是登录逻辑代码:

public class LoginActivity extends BaseActivity
        implements View.OnClickListener{

    private EditText etUserName;
    private EditText etPsw;
    private ImageView ivUserNameDelete;
    private ImageView ivPasswordDelete;
    private Button btnLogin;
    private ImageButton ibSetting;

    /**
     * 需要进行检测的权限数组
     *//*
    protected String[] needPermissions = {
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.READ_PHONE_STATE
    };

    private static final int PERMISSON_REQUESTCODE = 0;

    *//**
     * 判断是否需要检测,防止不停的弹框
     *//*
    private boolean isNeedCheck = true;

    @Override
    protected void onResume() {
        super.onResume();
        if(isNeedCheck){
            checkPermissions(needPermissions);
        }
    }

    *//**
     *
     * @param
     * @since 2.5.0
     * requestPermissions方法是请求某一权限,
     *//*
    private void checkPermissions(String... permissions) {
        List<String> needRequestPermissonList = findDeniedPermissions(permissions);
        if (null != needRequestPermissonList
                && needRequestPermissonList.size() > 0) {
            ActivityCompat.requestPermissions(this,
                    needRequestPermissonList.toArray(
                            new String[needRequestPermissonList.size()]),
                    PERMISSON_REQUESTCODE);
        }
    }

    *//**
     * 获取权限集中需要申请权限的列表
     *
     * @param permissions
     * @return
     * @since 2.5.0
     * checkSelfPermission方法是在用来判断是否app已经获取到某一个权限
     * shouldShowRequestPermissionRationale方法用来判断是否
     * 显示申请权限对话框,如果同意了或者不在询问则返回false
     *//*
    private List<String> findDeniedPermissions(String[] permissions) {
        List<String> needRequestPermissonList = new ArrayList<String>();
        for (String perm : permissions) {
            if (ContextCompat.checkSelfPermission(this,
                    perm) != PackageManager.PERMISSION_GRANTED) {
                needRequestPermissonList.add(perm);
            } else {
                if (ActivityCompat.shouldShowRequestPermissionRationale(
                        this, perm)) {
                    needRequestPermissonList.add(perm);
                }
            }
        }
        return needRequestPermissonList;
    }

    *//**
     * 检测是否所有的权限都已经授权
     * @param grantResults
     * @return
     * @since 2.5.0
     *
     *//*
    private boolean verifyPermissions(int[] grantResults) {
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    *//**
     * 申请权限结果的回调方法
     *//*
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String[] permissions, int[] paramArrayOfInt) {
        if (requestCode == PERMISSON_REQUESTCODE) {
            if (!verifyPermissions(paramArrayOfInt)) {
                showMissingPermissionDialog();
                isNeedCheck = false;
            }
        }
    }

    *//**
     * 显示提示信息
     *
     * @since 2.5.0
     *
     *//*
    private void showMissingPermissionDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("提示");
        builder.setMessage("当前应用缺少必要权限。请点击\"设置\"-\"权限\"-打开所需权限。");

        // 拒绝, 退出应用
        builder.setNegativeButton("取消",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                });

        builder.setPositiveButton("设置",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startAppSettings();
                    }
                });

        builder.setCancelable(false);

        builder.show();
    }

    *//**
     *  启动应用的设置
     *
     * @since 2.5.0
     *
     *//*
    private void startAppSettings() {
        Intent intent = new Intent(
                Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivity(intent);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            this.finish();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }*/


    @Override
    protected void initAdapter() {

    }

    @Override
    protected void initListener() {

        ivUserNameDelete.setOnClickListener(this);
        ivPasswordDelete.setOnClickListener(this);
        btnLogin.setOnClickListener(this);
        ibSetting.setOnClickListener(this);

        checkEditText();
        etUserName.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                checkEditText();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
        etPsw.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                checkEditText();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }

    private void checkEditText() {
        ivUserNameDelete.setVisibility(TextUtils.isEmpty(etUserName.getText()) ?
                View.GONE : View.VISIBLE);
        ivPasswordDelete.setVisibility(TextUtils.isEmpty(etPsw.getText()) ?
                View.GONE : View.VISIBLE);
    }

    @Override
    protected void updateView() {

    }

    @Override
    protected void initData() {

    }

    @Override
    protected void initView() {

        etUserName = findId(R.id.et_username);
        etPsw = findId(R.id.et_password);

        ivUserNameDelete = findId(R.id.iv_username_delete);
        ivPasswordDelete = findId(R.id.iv_password_delete);

        btnLogin = findId(R.id.btn_login);

        ibSetting = findId(R.id.ib_setting);

    }

    @Override
    public int getLayoutId() {
        return R.layout.activity_login;
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 1:
                    loadingProgress.dismiss();
                    LoginResponse loginResponse = (LoginResponse) msg.obj;
                    if(null != loginResponse){
                        if(loginResponse.getRetCode().equals("0")){
                            PreferenceUtils.setPrefInt(LoginActivity.this,"userId",loginResponse.getMessage().getUserID());
                            PreferenceUtils.setPrefString(LoginActivity.this,"nickName",loginResponse.getMessage().getNickName());
                            PreferenceUtils.setPrefString(LoginActivity.this,"deptName",loginResponse.getMessage().getDeptName());
                            PreferenceUtils.setPrefInt(LoginActivity.this,"deptId",loginResponse.getMessage().getDeptID());
                            PreferenceUtils.setPrefInt(LoginActivity.this,"companyId",loginResponse.getMessage().getCompanyID());
                            PreferenceUtils.setPrefString(LoginActivity.this,"userName",loginResponse.getMessage().getUserName());
                            startActivity(new Intent(LoginActivity.this,MainActivity.class));
                            finish();
                        }else{
                            Toast.makeText(LoginActivity.this,loginResponse.getRetMsg(),Toast.LENGTH_SHORT).show();
                        }
                    }else{
                        Toast.makeText(LoginActivity.this,Constants.ACCESS_SERVER_FAILED,Toast.LENGTH_SHORT).show();
                    }
                    break;
            }
        }
    };

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.iv_username_delete:
                etUserName.setText("");
                break;
            case R.id.iv_password_delete:
                etPsw.setText("");
                break;
            case R.id.btn_login:
                if(NetWorkUtils.isConnected(this)){
                    if(vol()){
                        loadingProgress.show();
                        String username = etUserName.getText().toString().trim();
                        String password = etPsw.getText().toString().trim();
                        String ip = DeviceIpAddressUtil.getIPAddress(this);
                        String encrypt = MD5Tools.md5("appid=" + Constants.APP_ID +  "ipaddress=" + ip
                                +"password=" + password +"username="+ username + Constants.KEY)
                                .toUpperCase();
                        /*String url = "appid=" + Constants.APP_ID + "&username=" + username
                                + "&password=" + password + "&ipaddress=" + ip + "&encrypt=" + encrypt;*/
                        OkHttpClient okHttpClient = new OkHttpClient
                                .Builder()
                                .connectTimeout(3,TimeUnit.SECONDS)
                                .readTimeout(3,TimeUnit.SECONDS)
                                .writeTimeout(3,TimeUnit.SECONDS)
                                .build();
                        RequestBody requestBody = new FormBody
                                .Builder()
                                .add("username",username)
                                .add("password",password)
                                .add("ipaddress",ip)
                                .build();
                        Request requestPost = new Request.Builder()
                                .url(Constants.BASE_LOGIN_URL + "appid=" + Constants.APP_ID
                                + "&encrypt=" + encrypt)
                                .post(requestBody)
                                .build();
                        okHttpClient.newCall(requestPost).enqueue(new Callback() {
                            @Override
                            public void onFailure(Call call, IOException e) {
                                Utils.runOnUIThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        loadingProgress.dismiss();
                                        Toast.makeText(LoginActivity.this,Constants.CONNECTION_TIMEOUT,Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }

                            @Override
                            public void onResponse(Call call, Response response) throws IOException {
                                String s = response.body().string();
                                Log.e("login",s);
                                LoginResponse loginResponse = GsonUtils.paserJsonToBean(s,LoginResponse.class);
                                Message msg = new Message();
                                msg.obj = loginResponse;
                                msg.what = 1;
                                handler.sendMessage(msg);
                            }
                        });
                        /*Request request = new Request
                                .Builder()
                                .url(Constants.BASE_LOGIN_URL + url)
                                .build();
                        Call call = okHttpClient.newCall(request);
                        call.enqueue(new Callback() {
                            @Override
                            public void onFailure(Call call, IOException e) {

                                Utils.runOnUIThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        loadingProgress.dismiss();
                                        Toast.makeText(LoginActivity.this,Constants.CONNECTION_TIMEOUT,Toast.LENGTH_SHORT).show();
                                    }
                                });

                            }

                            @Override
                            public void onResponse(Call call, Response response) throws IOException {
                                String s = response.body().string();
                                Log.e("login",s);
                                LoginResponse loginResponse = GsonUtils.paserJsonToBean(s,LoginResponse.class);
                                Message msg = new Message();
                                msg.obj = loginResponse;
                                msg.what = 1;
                                handler.sendMessage(msg);
                            }
                        });*/


                    }
                }else{
                    Toast.makeText(this,Constants.NETWORK_UNLINKED,Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.ib_setting:
                startActivity(new Intent(this,SettingActivity.class));
                break;
        }
    }

    private boolean vol(){
        String username = etUserName.getText().toString().trim();
        String password = etPsw.getText().toString().trim();
        if(TextUtils.isEmpty(username)){
            Toast.makeText(this,"请输入用户名!",Toast.LENGTH_SHORT).show();
            return false;
        }
        if(TextUtils.isEmpty(password)){
            Toast.makeText(this,"请输入密码!",Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;
    }

}


猜你喜欢

转载自blog.csdn.net/qq_36428821/article/details/76154899