android最常见的UI之一,登录遍布各大APP,这么easy的东西还是要写写,主要是介绍下:密码的显示与隐藏,用户名和密码表单的网络请求和提交方式等细节问题。看一个简单的效果:

一,乾言

界面元素,logo,用户名,密码,登录按钮,底部两个按钮,访问有loading效果。
点击登录,获取用户和密码,简单校验,发送网络请求,然后校验请求结果,有异常做响应处理。

二,xml布局,view

布局代码,有点多,直接贴出来。需要的对应改吧改吧。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_gravity="center" android:background="@drawable/login_bg">    <!--main content-->    <LinearLayout  android:id="@+id/ll_login_body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_centerVertical="true" android:orientation="vertical">        <!--logo-->        <ImageView  android:id="@+id/iv_logo" android:layout_width="150dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="30dp" android:src="@drawable/logo_oair" />        <!--login username-->        <LinearLayout  android:id="@+id/ll_login_user" android:layout_width="wrap_content" android:layout_height="50dp" android:background="@drawable/input_bg" android:layout_gravity="center" android:orientation="horizontal" android:layout_marginLeft="30dp" android:layout_marginRight="30dp" android:layout_marginTop="20dp">            <ImageView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="15dp" android:background="@drawable/icon_user" />            <EditText  android:id="@+id/et_username" android:layout_width="0dp" android:layout_height="40dp" android:layout_weight="5" android:layout_gravity="center" android:layout_marginLeft="15dp" android:singleLine="true" android:ellipsize="middle" android:background="@android:color/transparent" android:text="@string/login_username_default" android:editable="false" android:textColor="@color/white" />            <ImageView  android:id="@+id/iv_show_name" android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="center" android:layout_marginLeft="5dp" android:layout_marginRight="2dp" android:scaleType="center" android:clickable="true" android:src="@drawable/icon_down" />        </LinearLayout>        <!--login password-->        <LinearLayout  android:layout_width="wrap_content" android:layout_height="50dp" android:background="@drawable/input_bg" android:layout_gravity="center" android:orientation="horizontal" android:layout_marginLeft="30dp" android:layout_marginRight="30dp" android:layout_marginTop="15dp">            <ImageView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="15dp" android:background="@drawable/icon_pwd" />            <EditText  android:id="@+id/et_password" android:layout_width="0dp" android:layout_height="40dp" android:layout_weight="5" android:layout_gravity="center" android:layout_marginLeft="15dp" android:focusable="true" android:inputType="textPassword" android:background="@android:color/transparent" android:textColor="@color/white" />            <ImageView  android:id="@+id/iv_hidden_pwd" android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="center" android:layout_marginLeft="5dp" android:layout_marginRight="2dp" android:scaleType="center" android:clickable="true" android:src="@drawable/icon_hidden" />        </LinearLayout>        <!--login btn-->        <Button  android:id="@+id/btn_login" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_gravity="center" android:layout_marginTop="40dp" android:text="@string/login_btn" android:textSize="20sp" android:textColor="@drawable/text_select" android:layout_marginLeft="30dp" android:layout_marginRight="30dp" android:background="@drawable/btn_login_bg" />    </LinearLayout>    <!--bottom btn-->    <RelativeLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="30dp" android:layout_marginRight="30dp" android:layout_alignParentBottom="true" android:layout_marginBottom="20dp" android:layout_below="@id/ll_login_body">        <TextView  android:id="@+id/tv_login_contactus" android:text="@string/login_about" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentBottom="true" android:textSize="16sp" android:padding="10dp" android:clickable="true" android:textColor="#FFF" />        <TextView  android:id="@+id/tv_login_guest" android:text="@string/login_guest" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:textSize="16sp" android:padding="10dp" android:clickable="true" android:textColor="#FFF" />    </RelativeLayout>    <ProgressBar  android:id="@+id/pb_login" style="@style/MyCircleProgressBar" android:layout_width="50dp" android:layout_height="wrap_content" android:layout_centerInParent="true" android:visibility="gone" android:indeterminateDuration="700"/></RelativeLayout>

注册view和事件

findViewById的事情就别自己一个个复制了,使用ButterKnife依赖注入view和事件,类似的框架很多。例如:

    @Bind(R.id.et_username)    public EditText et_username;    @Bind(R.id.et_password)    public EditText et_password;

在onCreate方法中,注入:

 ButterKnife.bind(this);

之前犯过错误,@Bind view需要使用public修饰属性。

Error:(68, 23) 错误: @Bind fields must not be private or static. (com.oair.oair_client.LoginActivity.iv_logo)

三,activity登录逻辑

获取edittext中的value,判断用户名,密码是否为空,如果ok就进行网络请求,post后台登录接口。我用retrofit+okhttp+RxJava/RxAndroid实现登录,json用内部封装的gson解析。

 @OnClick(R.id.btn_login)    public void LoginOair(){        Login();    }    //Login 管理员登录    public void Login() {        // 点击登录的时候 拿到用户名和密码的值        username = et_username.getText().toString();        password = et_password.getText().toString();        //判断密码是否为空        if (StringUtils.isEmpty(password)) {            showDialog(context.getResources().getString(R.string.dialog_pwd_empty));        } else {            //验证登录是否成功            postLogin();        }    }    private void postLogin() {        pb_login.setVisibility(View.VISIBLE);        MyRetrofitUtils.init().loginOair(password, new Subscriber<OairResponse>() {            @Override            public void onCompleted() {                pb_login.setVisibility(View.GONE);            }            @Override            public void onError(Throwable e) {                checkLocalPwd();                LogUtils.debug(TAG,"error "+e.toString());                pb_login.setVisibility(View.GONE);            }            @Override            public void onNext(OairResponse oairResponse) {                LogUtils.debug(TAG,oairResponse.toString());                if (oairResponse.result == MyConstant.RESULT_SUCCESS){                    enterMainActivity();                }else{       showDialog(context.getResources().getString(R.string.dialog_pwd_error));                }            }        });    }

不会用?可以使用你喜欢的网络访问方式,OKHTTP,HTTPUrlConnection,xUtils,volley都行。或者请看我的另外一篇文章,点击打开:
RxJava+Retrofit+Gson实现网络请求

四,隐藏和显示密码

EditText控件本身就封装好了显示与隐藏的方法,可以方便地将文本置为可见,或者隐藏。

 //切换输入密码的模式,明文or密文显示    private boolean isHidden=true;    @OnClick(R.id.iv_hidden_pwd)    public void hiddenPassword() {        if (isHidden) {            //设置EditText文本为可见的            et_password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());        } else {            //设置EditText文本为隐藏的            et_password.setTransformationMethod(PasswordTransformationMethod.getInstance());        }        isHidden = !isHidden;        et_password.postInvalidate();        //切换后将EditText光标置于末尾        CharSequence charSequence = et_password.getText();        if (charSequence!=null) {            Spannable spanText = (Spannable) charSequence;            Selection.setSelection(spanText, charSequence.length());        }    }

五,输入法弹出,布局调整

有时候手机频幕小,弹出输入法框,可能会将edittext控件挡住,影响输入。这时候我们可以配置下activity。

 <activity  android:name="com.xx.client.LoginActivity" android:configChanges="keyboardHidden|orientation" android:label="@string/title_activity_login" android:launchMode="singleTask" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize"/>

重点就是android:configChanges和android:windowSoftInputMode的属性,让activity自动调整界面,输入法位于输入框的下方。

六,总结

看似简单的一个功能,细看起来,知识点还是挺多的。这里面还有很多东西没有列出,比如用户名下拉选择一个用户登录,登录保存状态下次免登录,cookie的使用等。
未完待续,欢迎交流,杜乾,Dusan,Q 291902259。

更多相关文章

  1. android源代码分析一:使用内部(com.android.internal)和隐藏(@hid
  2. Android(安卓)密码校验,字符串中必须包含字母或者数字
  3. 第一节 登录界面
  4. Android(安卓)侧拉选择框
  5. 代码实现android的一个登录界面
  6. 在Android中如何通过点击edittext之外的部分使软键盘隐藏
  7. Android隐藏标题栏及解决启动闪过标题的实例详解
  8. Android强制弹出,隐藏输入法.
  9. 忘记密码 重置密码实现总结

随机推荐

  1. VmwareWorkstation 16无法安装VMware Too
  2. Mac系统上查看端口占用和释放端口教程
  3. 职场里,对数据库要有敬畏之心!
  4. 使用jquery实现全选、全不选等购物车操作
  5. Too many open files) when using LOCK T
  6. 【小思考】如何在实际工作中提升数据价值
  7. javascript常用代码汇总
  8. 控制器访问与参数解析类以及api天气接口
  9. 这个季节,梧桐要开始炸毛了。。。
  10. 运维到底该学哪门编程语言?