精华内容
下载资源
问答
  • Android自定义控件,登录账户,密码输入框,可以清空 输入信息,显隐藏密码
  • Android 登录输入框自动上移

    千次阅读 2017-05-02 19:43:41
    仿照拉钩网的登录做的登录界面,如图github 地址:https://github.com/chenzongwen/login

    仿照拉钩网的登录做的登录界面,如图

    这里写图片描述

    github 地址:https://github.com/chenzongwen/login

    展开全文
  • 主要介绍了Android 类似微信登录输入框效果,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 很多软件登录时都有那种间断的edittext,boss也提了这个需求,那就来实现一把咯。 话不多说,先上代码: //自定义一个EditText重写onTextContextMenuItem()方法 @SuppressLint("AppCompatCustomView") public ...

    很多软件登录时都有那种间断的edittext,boss也提了这个需求,那就来实现一把咯。

    话不多说,先上代码:

    //自定义一个EditText重写onTextContextMenuItem()方法
    @SuppressLint("AppCompatCustomView")
    public class LoginChildEditText extends EditText {
    private PasteListener pasteListener;
    public void setPasteListener(PasteListener pasteListener){
    this.pasteListener = pasteListener;
    }
    public LoginChildEditText(Context context) {
    super(context);
    }

    public LoginChildEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    }

    public LoginChildEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onTextContextMenuItem(int id) {
    if(id==android.R.id.paste){
    ClipboardManager clip = (ClipboardManager)getContext().getSystemService(Context.CLIPBOARD_SERVICE); //获取粘贴板
    if (clip != null) {
    String text = clip.getPrimaryClip().getItemAt(0).getText().toString();  //获取粘贴内容
    pasteListener.setPasteText(this,text);  //设置一个接口,由LoginChildEditText在外部实现
    }
    return true;
    }else {
    return super.onTextContextMenuItem(id);
    }
    }

    public interface PasteListener{
    void setPasteText(View view, String text);
    }
    }


    //自定义一个LinearLayout,装载LoginChildEditText实现输入框样式,如下图所示,



    public class LoginEditText extends LinearLayout implements View.OnKeyListener, View.OnFocusChangeListener, TextWatcher,LoginChildEditText.PasteListener {
    LoginChildEditText code1;
    LoginChildEditText code2;
    LoginChildEditText code3;
    LoginChildEditText code4;
    private int editInt;

    public void requestCodeFocus(){
    if(code1!=null){
    code1.setFocusable(true);
    code1.requestFocus();
    }
    }

    public String getString(){
    return code1.getText().toString() + code2.getText().toString()
    + code3.getText().toString() + code4.getText().toString();
    }

    public LoginEditText(Context context) {
    super(context);
    }

    public LoginEditText(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
    }

    public LoginEditText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    }

    private void init(Context context, AttributeSet attrs) {
    View view = LayoutInflater.from(context).inflate(R.layout.layout_login_identity_edit, this);
    code1 = view.findViewById(R.id.code_1);
    code2 = view.findViewById(R.id.code_2);
    code3 = view.findViewById(R.id.code_3);
    code4 = view.findViewById(R.id.code_4);

    code1.setOnKeyListener(this);
    code2.setOnKeyListener(this);
    code3.setOnKeyListener(this);
    code4.setOnKeyListener(this);
    code1.setOnFocusChangeListener(this);
    code2.setOnFocusChangeListener(this);
    code3.setOnFocusChangeListener(this);
    code4.setOnFocusChangeListener(this);
    code1.addTextChangedListener(this);
    code2.addTextChangedListener(this);
    code3.addTextChangedListener(this);
    code4.addTextChangedListener(this);

    code1.setPasteListener(this);
    code2.setPasteListener(this);
    code3.setPasteListener(this);
    code4.setPasteListener(this);

    InputMethodManager inputManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputManager != null) {
    inputManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
    }
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
    switch (editInt) {
    case 1:
    if (editable.toString().length() == 1) {
    code2.setFocusable(true);
    code2.requestFocus();
    }
    break;
    case 2:
    if (editable.toString().length() == 1) {
    code3.setFocusable(true);
    code3.requestFocus();
    }
    break;
    case 3:
    if (editable.toString().length() == 1) {
    code4.setFocusable(true);
    code4.requestFocus();
    }
    break;
    case 4:
    break;
    default:
    break;
    }
    }

    @Override
    public void onFocusChange(View view, boolean b) {
    switch (view.getId()) {
    case R.id.code_1:
    if (b) {
    editInt = 1;
    code1.setSelection(code1.getText().toString().length());
    }
    break;
    case R.id.code_2:
    if (b) {
    editInt = 2;
    code2.setSelection(code2.getText().toString().length());
    }
    break;
    case R.id.code_3:
    if (b) {
    editInt = 3;
    code3.setSelection(code3.getText().toString().length());
    }
    break;
    case R.id.code_4:
    if (b) {
    editInt = 4;
    code4.setSelection(code4.getText().toString().length());
    }
    break;
    default:
    break;
    }
    }

    @Override
    public boolean onKey(View view, int i, KeyEvent keyEvent) {
    if (KeyEvent.KEYCODE_DEL == keyEvent.getKeyCode() && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
    switch (editInt) {
    case 1:
    break;
    case 2:
    code1.setFocusable(true);
    code1.requestFocus();
    break;
    case 3:
    code2.setFocusable(true);
    code2.requestFocus();
    break;
    case 4:
    code3.setFocusable(true);
    code3.requestFocus();
    break;
    default:
    break;
    }
    }
    return false;
    }

    //重写setPasteText完成复制功能
    @Override
    public void setPasteText(View view,String text) {
    Logger.d(text);
    if(view.getId()== R.id.code_1||view.getId()== R.id.code_2||view.getId()== R.id.code_3||view.getId()== R.id.code_4){
    Logger.d(String.valueOf(text.charAt(0)));
    if(text.length()==1){
    code1.setText(String.valueOf(text.charAt(0)));
    code2.setFocusable(true);
    code2.requestFocus();
    }else if(text.length()==2){
    code1.setText(String.valueOf(text.charAt(0)));
    code2.setText(String.valueOf(text.charAt(1)));
    code3.setFocusable(true);
    code3.requestFocus();
    }else if(text.length()==3){
    code1.setText(String.valueOf(text.charAt(0)));
    code2.setText(String.valueOf(text.charAt(1)));
    code3.setText(String.valueOf(text.charAt(2)));
    code4.setFocusable(true);
    code4.requestFocus();
    }else if(text.length()>=4){
    code1.setText(String.valueOf(text.charAt(0)));
    code2.setText(String.valueOf(text.charAt(1)));
    code3.setText(String.valueOf(text.charAt(2)));
    code4.setText(String.valueOf(text.charAt(3)));
    code4.setSelection(code4.getText().toString().length());
    }
    }
    }
    }


    // R.layout.layout_login_identity_edit 布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="15dp">
    
            <com.qitiancp.customview.LoginChildEditText
                android:id="@+id/code_1"
                android:layout_width="31dp"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_marginBottom="10dp"
                android:background="@null"
                android:gravity="center"
                android:includeFontPadding="false"
                android:inputType="number"
                android:maxLength="1"
                android:nextFocusDown="@id/code_2"
                android:singleLine="true"
                android:text=""
                android:textColor="@color/black"
                android:textSize="29sp" />
    
            <ImageView
                android:layout_width="31dp"
                android:layout_height="2dp"
                android:layout_below="@id/code_1"
                android:scaleType="fitXY"
                android:src="@drawable/underline" />
        </RelativeLayout>
    
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="15dp">
    
            <com.qitiancp.customview.LoginChildEditText
                android:id="@+id/code_2"
                android:layout_width="31dp"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_marginBottom="10dp"
                android:background="@null"
                android:gravity="center"
                android:includeFontPadding="false"
                android:inputType="number"
                android:maxLength="1"
                android:nextFocusDown="@id/code_3"
                android:singleLine="true"
                android:text=""
                android:textColor="@color/black"
                android:textSize="29sp" />
    
            <ImageView
                android:layout_width="31dp"
                android:layout_height="2dp"
                android:layout_below="@id/code_2"
                android:src="@drawable/underline" />
        </RelativeLayout>
    
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="15dp">
    
            <com.qitiancp.customview.LoginChildEditText
                android:id="@+id/code_3"
                android:layout_width="31dp"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_marginBottom="10dp"
                android:background="@null"
                android:gravity="center"
                android:includeFontPadding="false"
                android:inputType="number"
                android:maxLength="1"
                android:nextFocusDown="@id/code_4"
                android:singleLine="true"
                android:text=""
                android:textColor="@color/black"
                android:textSize="29sp" />
    
            <ImageView
                android:layout_width="31dp"
                android:layout_height="2dp"
                android:layout_below="@id/code_3"
                android:src="@drawable/underline" />
        </RelativeLayout>
    
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="15dp">
    
            <com.qitiancp.customview.LoginChildEditText
                android:id="@+id/code_4"
                android:layout_width="31dp"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_marginBottom="10dp"
                android:background="@null"
                android:gravity="center"
                android:includeFontPadding="false"
                android:inputType="number"
                android:maxLength="1"
                android:singleLine="true"
                android:text=""
                android:textColor="@color/black"
                android:textSize="29sp" />
    
            <ImageView
                android:layout_width="31dp"
                android:layout_height="2dp"
                android:layout_below="@id/code_4"
                android:src="@drawable/underline" />
        </RelativeLayout>
    
    </LinearLayout>



    ok!


    展开全文
  • 作者丨实例波https://www.jianshu.com/p/3238a5afc21c前言验证码输入框是很多APP必不可少的组件,之前在重构注册登录页面的时候,重新设计了UI,所以不能再简单的用EditText来做了,所以这篇文章将分享一下如何实现...

    640?wx_fmt=gif

    640?wx_fmt=jpeg

    黑客技术点击右侧关注,了解黑客的世界!640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    Linux编程点击右侧关注,免费入门到精通!640?wx_fmt=jpeg
    作者丨实例波
    https://www.jianshu.com/p/3238a5afc21c
    前言

    验证码输入框是很多APP必不可少的组件,之前在重构注册登录页面的时候,重新设计了UI,所以不能再简单的用EditText来做了,所以这篇文章将分享一下如何实现一个常见的验证码输入框。

    正文

    先搂一眼效果吧

    640?wx_fmt=other640?wx_fmt=other

    不要把注意力都放在头顶的那一抹绿上,重点在输入框,可能大多数APP里都是采用6个方框的UI效果,我这里是按照我们设计的要求,用6根横线来划出6个数字的位置。一开始我想的是直接用6个TextView,然后传递焦点的做法,但是发现实现起来有一定的难度。又在网上查了一下,发现比较靠谱的办法是用6个TextView加一个EditText来实现,也按照这个方法去实现了,但是后来在测试的时候就发现了问题:网上给出的实现方式需要监听软键盘的删除按钮

    editText.setOnKeyListener(new OnKeyListener() {
                @Overridepublic boolean onKey(View v, int keyCode, KeyEvent event{if (keyCode == KeyEvent.KEYCODE_DEL
                            && event.getAction() == KeyEvent.ACTION_DOWN) {//TODO:return true;
                    }return false;
                }
            });

    这是一个大家熟知的写法,但是这个监听的方法其实并不靠谱(在安卓原生键盘上就监听不到),因为这个监听是否触发,并没有强制的要求,全看输入法开发者的心情,这是官方文档中的描述:

    Key presses in software keyboards will generally NOT trigger this method, although some may elect to do so in some situations.

    只能输入,不能删除,这可不行啊,用户肯定会骂娘的,我可不想被拿去去祭天什么的…
    于是乎只能想办法在原有的基础上做一些修改,来规避这个问题,最后采用的方案是:采用一个TextView的数组来维护6个TextView,然后藏一个透明的EditTextView在后面用于接收用户输入的内容,再把输入的内容展示到6个TextView上就行了,UI什么的可以自己随意设计。在实现的过程中,遇到的一个关键问题就是:当输入的内容超过6位以后我该如何处理?一开始的方案是通过判断当前输入的位数然后再做相应的处理,网上的方案也是这么实现的,我后来一想,根本用不着这么麻烦,只需要一行属性就能解决这个问题:

    android:maxLength="6"

    只需要在EditText的属性里限制它的最大长度,就不用再去代码里做处理了,直接把EditTextView里的内容完全照搬到TextView上就可以了。
    最终的完整代码如下:

    public class VerifyCodeView extends RelativeLayout {private EditText editText;private TextView[] textViews;private static int MAX = 6;private String inputContent;public VerifyCodeView(Context context) {this(context, null);
        }public VerifyCodeView(Context context, AttributeSet attrs) {this(context, attrs, 0);
        }public VerifyCodeView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);
            View.inflate(context, R.layout.view_verify_code, this);
            textViews = new TextView[MAX];
            textViews[0] = (TextView) findViewById(R.id.tv_0);
            textViews[1] = (TextView) findViewById(R.id.tv_1);
            textViews[2] = (TextView) findViewById(R.id.tv_2);
            textViews[3] = (TextView) findViewById(R.id.tv_3);
            textViews[4] = (TextView) findViewById(R.id.tv_4);
            textViews[5] = (TextView) findViewById(R.id.tv_5);
            editText = (EditText) findViewById(R.id.edit_text_view);
            editText.setCursorVisible(false);//隐藏光标
            setEditTextListener();
        }private void setEditTextListener() {
            editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                }@Overridepublic void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                }@Overridepublic void afterTextChanged(Editable editable) {
                    inputContent = editText.getText().toString();if (inputCompleteListener != null) {if (inputContent.length() >= MAX) {
                            inputCompleteListener.inputComplete();
                        } else {
                            inputCompleteListener.invalidContent();
                        }
                    }for (int i = 0; i                     if (i                         textViews[i].setText(String.valueOf(inputContent.charAt(i)));
                        } else {
                            textViews[i].setText("");
                        }
                    }
                }
            });
        }private InputCompleteListener inputCompleteListener;public void setInputCompleteListener(InputCompleteListener inputCompleteListener) {this.inputCompleteListener = inputCompleteListener;
        }public interface InputCompleteListener {void inputComplete();void invalidContent();
        }public String getEditContent() {return inputContent;
        }
    }

    经过thisfeng的提醒,发现存在几个问题:

    1.双击和长按会选中EditText的内容,出现复制粘贴等选项

    2.光标位置会随着点击而改变,输入数字可能会插入到中间的位置

    于是做了相应的修改:

    //屏蔽长按事件
    android:longClickable="false"
    使用自定义EditText:public class MyEditText extends AppCompatEditText {private long lastTime = 0;public MyEditText(Context context) {super(context);
        }public MyEditText(Context context, AttributeSet attrs) {super(context, attrs);
        }public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);
        }@Overrideprotected void onSelectionChanged(int selStart, int selEnd) {super.onSelectionChanged(selStart, selEnd);//把光标位置固定在最末this.setSelection(this.getText().length());
        }@Overridepublic boolean onTouchEvent(MotionEvent event) {//屏蔽双击事件switch (event.getAction()) {case MotionEvent.ACTION_DOWN:long currentTime = System.currentTimeMillis();if (currentTime - lastTime 500
    ) {
                        lastTime = currentTime;return true;
                    } else {
                        lastTime = currentTime;
                    }break;
            }return super.onTouchEvent(event);
        }
    }

    如果需要完整的demo,可以访问我的github:

    https://github.com/jb274585381/VerifyCodeViewDemo

    结语

    有时候我们实现一个需求,不光要考虑最终的效果,还要考虑时间成本,能用最简单的方法实现当然是最好的,省下的时间拿来打把昆特牌也是不错的。而且写的代码越少,出错的几率越低嘛,是不是~  好了今天就分享到这里,我要去熬我的西米露了。如有错误,欢迎大家指正。

    【无门槛免费领】

    535G超强程序员编程

    0基础从入门到精通自学视频教程!

    640?wx_fmt=jpeg

    640?wx_fmt=jpeg 640?wx_fmt=jpeg

    640?wx_fmt=jpeg 640?wx_fmt=jpeg 640?wx_fmt=jpeg

    640?wx_fmt=jpeg 640?wx_fmt=jpeg 640?wx_fmt=jpeg

    640?wx_fmt=jpeg 640?wx_fmt=jpeg 640?wx_fmt=jpeg

    640?wx_fmt=jpeg 640?wx_fmt=jpeg 640?wx_fmt=jpeg 640?wx_fmt=jpeg

    640?wx_fmt=png万水千山总是情,点个 “在看” 行不行
    展开全文
  • Android 验证码输入框的实现

    千次阅读 热门讨论 2018-12-10 22:25:41
    上篇博客讲到登录注册的流程所需用到的带显示密码的输入框,而在整个完整流程中,短信发送获取验证码并填写相信也是重要的一环。当然,关于验证码的实现很多大神的博客也写过,并且款式多样,任君选择,这里只是记录...

      上篇博客讲到登录注册的流程所需用到的带显示密码的输入框,而在整个完整流程中,短信发送获取验证码并填写相信也是重要的一环。当然,关于验证码的实现很多大神的博客也写过,并且款式多样,任君选择,这里只是记录一下小弟在开发过程中用到的验证码输入框。

      先上图:

                                                                                  

      要实现的就是中间的那个验证码输入框。

      这里我们需要实现的点有:1)EditText的排版布局; 2)EditText的背景框; 3)在自定义View编写时需要对第一个输入框进行焦点获取; 4)当输入完一个框后需要自动对焦下一个输入框

      1.EditText的排版布局

      和之前一样,我们先在布局文件中定义好这四个输入框,然后通过建立自定义View继承自ViewGroup或其子类并传入此布局作为我们的操作的View。

      注意:这里由于每个验证码框仅能输入一位,所以我们在布局里对每一个EditText控件都要有最大长度的属性要求。

                             

      2.EditText的背景框

       相信大家对drawable目录下的各种drawable文件都玩的得心应手了,小弟想着代码量不多,并没有对焦点是否对焦的状态分开来写,而是直接写在了selector下,以减少操作量。

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_focused="true">
            <layer-list>
                <item>
                    <shape>
                        <solid android:color="#c6defdff" />
                        <corners android:radius="30dp" />
                    </shape>
                </item>
                <item android:left="5dp" android:top="5dp"
                    android:bottom="5dp" android:right="5dp">
                    <shape>
                        <solid android:color="@android:color/white" />
                        <corners android:radius="12dp" />
                        <stroke android:color="@color/colorAccent"
                            android:width="1dp" />
                    </shape>
                </item>
            </layer-list>
        </item>
        <item android:state_focused="false">
            <layer-list>
                <item>
                    <shape>
                        <solid android:color="#26ededed" />
                        <corners android:radius="30dp" />
                    </shape>
                </item>
                <item android:left="5dp" android:top="5dp"
                    android:right="5dp" android:bottom="5dp">
                    <shape>
                        <solid android:color="@android:color/white" />
                        <corners android:radius="12dp" />
                        <stroke android:color="#43cccccc"
                            android:width="1dp" />
                    </shape>
                </item>
            </layer-list>
        </item>
    </selector>

      这里我用layer-list作了一个小阴影效果,以看起来有小小的层次感。然后对边界作了圆弧化。

      3.View的编写

      这里我们需要将第一个EditText自动获取其焦点。即:

    first.setFocusable(true);
    first.setFocusableInTouchMode(true);

      如果需要软键盘自动弹出,我们可以定义一个InputMethodManager来控制软键盘的弹出与收起,不过在某些机型上貌似有点问题,所以可以在manifest文件中对应的activity标签下添加属性:

    android:windowSoftInputMode="stateVisible|adjustResize"

      然后我们就要对输入过的文本框进行焦点清除,并获取下一个EditText的焦点。

    private void focus() {
        EditText editText;
        //利用for循环找出前面还没被输入字符的EditText
        for (int i = 0; i < mEdits.size(); i++) {
            editText = mEdits.get(i);
            if (editText.getText().length() < 1) {
                editText.requestFocus();
                return;
            } else {
                editText.setCursorVisible(false);
            }
        }
        EditText lastEditText = mEdits.get(mEdits.size() - 1);
        if (lastEditText.getText().length() > 0) {
            //收起软键盘 并不允许编辑 同时将输入的文本提交
            getResponse();
            lastEditText.setCursorVisible(false);
            InputMethodManager imm = (InputMethodManager) getContext()
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

      这里通过循环去找到前面还没有被输入过的文本框,若存在,则对其进行焦点获取(将此方法用于TextWatcher中监听每个输入框的输入事件,则可以实现自动获取下一个EditText的焦点);否则进行文本提交。

      完整代码:

    package com.example.carson.myapplicationtesting;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.support.annotation.Nullable;
    import android.text.Editable;
    import android.text.TextUtils;
    import android.text.TextWatcher;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.EditText;
    import android.widget.RelativeLayout;
    
    import java.util.ArrayList;
    
    import com.example.carson.myapplicationtesting.R;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by 84594 on 2018/7/30.
     */
    
    public class CodeView extends RelativeLayout implements View.OnFocusChangeListener {
    
        //设验证码有4位
        private EditText first, second, third, fourth;
    
        private OnInputFinishListener mInputListener;
    
        private List<EditText> mEdits = new ArrayList<EditText>();
    
        public CodeView(Context context) {
            this(context, null);
        }
    
        public CodeView(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public CodeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            initView();
        }
    
        private void initView() {
            LayoutInflater.from(getContext()).inflate(R.layout.layout_code, this, true);
            first = findViewById(R.id.edit_first);
            second = findViewById(R.id.edit_second);
            third = findViewById(R.id.edit_third);
            fourth = findViewById(R.id.edit_fourth);
    
            mEdits.add(first);
            mEdits.add(second);
            mEdits.add(third);
            mEdits.add(fourth);
    
            first.setFocusable(true);
            first.addTextChangedListener(new MyTextWatcher());
            second.addTextChangedListener(new MyTextWatcher());
            third.addTextChangedListener(new MyTextWatcher());
            fourth.addTextChangedListener(new MyTextWatcher());
    
            first.setOnFocusChangeListener(this);
            second.setOnFocusChangeListener(this);
            third.setOnFocusChangeListener(this);
            fourth.setOnFocusChangeListener(this);
        }
    
        @Override
        public void setEnabled(boolean enabled) {
            int childCount = getChildCount();
            for (int i = 0; i < childCount; i ++) {
                View child = getChildAt(i);
                child.setEnabled(enabled);
            }
        }
    
        @Override
        public void onFocusChange(View view, boolean focus) {
            if (focus) {
                focus();
            }
        }
    
        public void setmInputListener(OnInputFinishListener mInputListener) {
            this.mInputListener = mInputListener;
        }
    
        private class MyTextWatcher implements TextWatcher {
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
            }
    
            @Override
            public void afterTextChanged(Editable editable) {
                if (editable.length() != 0) {
                    focus();
                }
            }
        }
        private void focus() {
            EditText editText;
            //利用for循环找出前面还没被输入字符的EditText
            for (int i = 0; i < mEdits.size(); i++) {
                editText = mEdits.get(i);
                if (editText.getText().length() < 1) {
                    editText.requestFocus();
    
                    return;
                } else {
                    editText.setCursorVisible(false);
                }
            }
            EditText lastEditText = mEdits.get(mEdits.size() - 1);
            if (lastEditText.getText().length() > 0) {
                //收起软键盘 并不允许编辑 同时将输入的文本提交
                getResponse();
                lastEditText.setCursorVisible(false);
                InputMethodManager imm = (InputMethodManager) getContext()
                        .getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }
    
        public void getResponse() {
            Log.e("CodeView", "ok");
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < mEdits.size(); i++) {
                sb.append(mEdits.get(i).getText().toString());
            }
            if (mInputListener != null) {
                mInputListener.onFinish(sb.toString());
            }
        }
    
        //对外封装一个重置或直接填写验证码的方法
        public void setText(String text) {
            if (text.length() == mEdits.size()) {
                StringBuilder sb = new StringBuilder(text);
                first.setText(sb.substring(0, 1));
                second.setText(sb.substring(1, 2));
                third.setText(sb.substring(2, 3));
                fourth.setText(sb.substring(3, 4));
            } else {
                first.setText("");
                second.setText("");
                third.setText("");
                fourth.setText("");
    //            first.setCursorVisible(true);
                first.requestFocus();
            }
        }
    
        //一个监听输入结束的接口,以便外部回调结束后执行的方法
        public interface OnInputFinishListener {
            void onFinish(String code);
        }
    }
    
    

      布局:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:gravity="center">
    
            <EditText
                android:id="@+id/edit_first"
                android:layout_width="0dp"
                android:layout_height="70dp"
                android:layout_weight="1"
                android:inputType="number"
                android:textSize="40sp"
                android:maxLength="1"
                android:textCursorDrawable="@null"
                android:textColor="@color/colorAccent"
                android:textAlignment="center"
                android:background="@drawable/selector_code_edit"
                android:layout_margin="5dp"/>
            <EditText
                android:id="@+id/edit_second"
                android:layout_width="0dp"
                android:layout_height="70dp"
                android:layout_weight="1"
                android:inputType="number"
                android:textSize="40sp"
                android:maxLength="1"
                android:textColor="@color/colorAccent"
                android:textCursorDrawable="@null"
                android:textAlignment="center"
                android:background="@drawable/selector_code_edit"
                android:layout_margin="5dp"/>
    
            <EditText
                android:id="@+id/edit_third"
                android:layout_width="0dp"
                android:layout_height="70dp"
                android:layout_weight="1"
                android:inputType="number"
                android:textSize="40sp"
                android:maxLength="1"
                android:textColor="@color/colorAccent"
                android:textCursorDrawable="@null"
                android:textAlignment="center"
                android:background="@drawable/selector_code_edit"
                android:layout_margin="5dp"/>
            <EditText
                android:id="@+id/edit_fourth"
                android:layout_width="0dp"
                android:layout_height="70dp"
                android:layout_weight="1"
                android:inputType="number"
                android:textSize="40sp"
                android:maxLength="1"
                android:textColor="@color/colorAccent"
                android:textCursorDrawable="@null"
                android:textAlignment="center"
                android:background="@drawable/selector_code_edit"
                android:layout_margin="5dp"/>
        </LinearLayout>
    
    
    </RelativeLayout>

     

    展开全文
  • 验证码输入框是很多APP必不可少的组件,之前在重构注册登录页面的时候,重新设计了UI,所以不能再简单的用EditText来做了,所以这篇文章将分享一下如何实现一个常见的验证码输入框。 正文 重点在输入框,可能...
  • Android键盘挡住输入框

    2019-04-19 01:01:26
    亲测可用,可以直接放到项目中进行使用 * 本来以为Actviity设置下android:windowSoftInputMode="adjustResize|...不行吧,我这边已经全部解决,键盘遮挡输入框,遮挡输入框登录按钮,一 一解决了 简单操作,易扩展
  • android 输入框 布局

    2012-08-29 11:05:00
    在做登录和注册页面的时候,经常会遇到诸如软键盘挡住输入框的情况,android为此提供了一系列的的配置参数供选择,你可以在androidmanufist.xml的对应Activity的windowSoftInputMode属性中选择如下4者之一进行配置...
  • android输入框内容改变的监听事件

    万次阅读 2017-06-16 09:12:25
    android输入框内容改变的监听事件一般用于比如我们常见的:登录qq时 用户名输入完整时头像自动显示,或者注册用户时实时提示注册格式是否正确等。那么我们在这里举例:判断输入框是否有内容,来改变按钮的状态,常...
  • Android也可像iOS7一样...首先是输入框Android4.2的输入框是只有一条下划线,比较难看 1.在drawable里new–》drawable resource file……编写输入框的样式 然后再activity_main.mxl中background引用。 <shape xmlns
  • 这是一个 Android 登录账户 密码 输入框 , 采用 自定义 控件 形式 以下是 自定义控件 的 布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" ...
  • android输入框内容改变的监听事件一般用于比如我们常见的:登录qq时 用户名输入完整时头像自动显示,或者注册用户时实时提示注册格式是否正确等。那么我们在这里举例:判断输入框是否有内容,来改变按钮的状态,常...
  • 当进入登录页面或有输入框的页面时,首先输入框会获取焦点并弹出输入法,那么在记住账号和密码的情况下,是不需要弹出的,所以每次弹出输入法都是不可取的,对此我的解决办法是在非输入控件上加上 android:...
  • 有些人说可以用它的android:InputTpye=“textPassword”。但是这个属性并没有我们需要展示的星号而是变成了....圆点展示。我是继承了ReplacementTransformationMethod,而它也实现了TransformationMethod接口。这个类...
  • 像微信则直接把登录按钮做在输入框的上面,但有很多情况下,这经常满足不了需求。同时如果输入框特别多的情况下,点击输入时,当前输入框没被挡住,但是当前输入框下面的输入框却无法获取焦点...
  • 安卓开发登录输入框智能提示历史登录账号   在web登录页面中这是比较常见的功能,谷歌浏览器甚至会帮我们记住账号而不需要开发人员写这个功能。在移动端的开发中h5页面实现提示历史登录账号和web差别不大,但是...
  • 我想请教大家如何实现类似于QQ账号登录,用户名,密码两个输入框,当我点击用户名输入框里面最右边的删除图标时如何同时清空用户名,密码两个输入框里面的内容
  • android:windowSoftInputMode="adjustResize|stateHidden" 2.自定义Linerlayout重写onLayout。判断键盘弹出,隐藏显示相关控件即可 var keyboardShowed = false override fun onLayout(changed: ...
  • 点击输入框之后输入框上提示的文字会通过一个动画变换到输入框上方,android原生早已有此特效,文章详情链接地址:LoginBox
  • 原标题:Android技术痛点——各种键盘挡住输入框终极解决办法 -你一定用得到相关阅读:作者:潇潇凤儿原文:http://blog.csdn.net/smileiam对于键盘挡住输入框,给出了多种方案,希望对大家有所帮助。在开发中,...
  • 常常在网上登录的时候看到这样一个效果,就是当我们选择账号或者密码输入框时,它的背景会变成一种选中的状态,也就是输入框四周会有一种选中颜色的渐变效果。  所以很多情况下我们也希望自己的APP也能有这样的效果...
  • Android软键盘挡住输入框

    千次阅读 2019-04-19 14:04:13
    今天产品突然过来说APP登录界面软键盘遮挡了editText的输入框体验不好,确实是,那就开始操作: 在网上一查,打多数都是这样写的: 第一种 1 2 3 4 5 <activity android:...
  • Android自定义控件,登录账户,密码输入框,可以清空 输入信息,显隐藏密码.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • Android:EditText回车跳到下一个输入框登录

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 361
精华内容 144
关键字:

android登录输入框