软键盘

作者: 沈溺_16e5 | 来源:发表于2019-05-09 08:48 被阅读0次
<activity
    android:name=".ui.login.LoginActivity"
    android:theme="@style/FullScreen"
    android:windowSoftInputMode="stateVisible|adjustResize">

android:windowSoftInputMode="stateVisible|adjustResize"
一进入到这个Activity就弹出软键盘
https://www.cnblogs.com/momoshengxiao/p/4889631.html

点击非EditText控件弹出软键盘

InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
rl.requestFocus(); //setFocus方法无效 

rl 是一个RelativeLayout
https://mp.weixin.qq.com/s/XG3-oLS84a27eW61UijnJw
这篇鸿洋大神的文章中有更详细的讲解
https://mp.weixin.qq.com/s/6VJALLA1bAFSujkZkdSNVQ
这篇是对上篇使用的原理讲解

不使用系统的软键盘

某些情况下,需要我们自己在布局中写一个 GridView 来模拟实现数字验证码的输入键盘,这个时候就需要禁掉系统的软键盘

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

自定义的数字键盘

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.baidu.adt.hmi.passenger.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.annotation.Nullable;

public class NumericKeypadView extends RelativeLayout {

    private static final int MAX_INPUT_NUMBER = 4;
    private GridView mGridView;
    private String strPass = "";
    private List<Integer> intPassArr = new ArrayList<>();
    private List<Integer> listNumber = new ArrayList<>();
    private View mPassLayout;
    private boolean isRandom = false;

    public interface OnKeypadClickListener {
        void onPass(List<Integer> list);

        void onPassFinish(List<Integer> list);
    }

    private OnKeypadClickListener keypadClickListener;

    public void setKeypadClickListener(OnKeypadClickListener listener) {
        keypadClickListener = listener;
    }

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

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

    public NumericKeypadView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView();
        this.addView(mPassLayout);
    }

    private void initView() {
        mPassLayout = LayoutInflater.from(getContext()).
                inflate(R.layout.view_numeric_keypad, null);
        mGridView = (GridView) mPassLayout.findViewById(R.id.gv_pass);
        initData();
    }

    private void initData() {
        if (isRandom) {
            listNumber = new ArrayList<>();
            listNumber.clear();
            for (int i = 0; i <= 10; i++) {
                listNumber.add(i);
            }
            Collections.shuffle(listNumber);
            for (int i = 0; i <= 10; i++) {
                if (listNumber.get(i) == 10) {
                    listNumber.remove(i);
                    listNumber.add(9, 10);
                }
            }
            listNumber.add(11);
        } else {
            listNumber = new ArrayList<>();
            listNumber.clear();
            for (int i = 1; i <= 9; i++) {
                listNumber.add(i);
            }
            listNumber.add(10);
            listNumber.add(0);
            listNumber.add(11);
        }

        mGridView.setAdapter(adapter);
    }

    BaseAdapter adapter = new BaseAdapter() {
        @Override
        public int getCount() {
            return listNumber.size();
        }

        @Override
        public Object getItem(int position) {
            return listNumber.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if (convertView == null) {
                convertView = View.inflate(NumericKeypadView.this.getContext(),
                        R.layout.view_numeric_keypad_gridview_item, null);
                holder = new ViewHolder();
                holder.btnNumber = (TextView) convertView.findViewById(R.id.btNumber);
                convertView.setTag(holder);
                if (position == 9 || position == 11) {
                    holder.btnNumber.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);  // 方法4
                }
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.btnNumber.setText(listNumber.get(position) + "");
            if (position == 11) {
                holder.btnNumber.setText("回退");
                //                holder.btnNumber.setBackgroundColor(NumericKeypadView.this
                //                .getContext()
                //                        .getResources().getColor(R.color.graye3));
            }
            if (position == 9) {
                holder.btnNumber.setText("清除");
                //                holder.btnNumber.setBackgroundColor(NumericKeypadView.this
                //                .getContext()
                //                        .getResources().getColor(R.color.graye3));
            }
            //监听事件----------------------------
            if (position == 9) {
                holder.btnNumber.setOnTouchListener(new OnTouchListener() {

                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        if (position == 11) {
                            //                            switch (event.getAction()) {
                            //                                case MotionEvent.ACTION_DOWN:
                            //                                    holder.btnNumber
                            //                                    .setBackgroundResource(R.mipmap
                            //                                    .ic_pay_del1);
                            //                                    break;
                            //                                case MotionEvent.ACTION_MOVE:
                            //                                    holder.btnNumber
                            //                                    .setBackgroundResource(R.mipmap
                            //                                    .ic_pay_del1);
                            //                                    break;
                            //                                case MotionEvent.ACTION_UP:
                            //                                    holder.btnNumber
                            //                                    .setBackgroundResource(R.mipmap
                            //                                    .ic_pay_del0);
                            //                                    break;
                            //                            }
                        }
                        return false;
                    }
                });
            }
            holder.btnNumber.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (position < 11 && position != 9) {
                        if (strPass.length() == MAX_INPUT_NUMBER) {
                            return;
                        } else {
                            strPass = strPass + listNumber.get(position);
                            intPassArr.add(listNumber.get(position));

                            if (keypadClickListener != null) {
                                keypadClickListener.onPass(intPassArr);
                            }
                            if (strPass.length() == MAX_INPUT_NUMBER) {
                                if (keypadClickListener != null) {
                                    keypadClickListener.onPassFinish(intPassArr);
                                }
                            }
                        }
                    }
                    if (position == 11) {
                        if (strPass.length() > 0) {
                            strPass = strPass.substring(0, strPass.length() - 1);
                            intPassArr.remove(intPassArr.size() - 1);
                            if (keypadClickListener != null) {
                                keypadClickListener.onPass(intPassArr);
                            }
                        }
                    }
                    if (position == 9) {
                        strPass = "";
                        intPassArr.clear();
                        if (keypadClickListener != null) {
                            keypadClickListener.onPass(intPassArr);
                        }
                    }
                }
            });
            return convertView;
        }
    };

    static class ViewHolder {
        public TextView btnNumber;
    }

    public NumericKeypadView setRandomNumber(boolean israndom) {
        isRandom = israndom;
        initData();
        adapter.notifyDataSetChanged();
        return this;
    }

    public NumericKeypadView setCloseImgView(int resId) {
        return this;
    }

    public NumericKeypadView setCloseImgView(Bitmap bitmap) {
        return this;
    }

    public NumericKeypadView setCloseImgView(Drawable drawable) {
        return this;
    }

    public NumericKeypadView setForgetText(String text) {
        return this;
    }

    public NumericKeypadView setForgetSize(float textSize) {
        return this;
    }

    public NumericKeypadView setForgetColor(int textColor) {
        return this;
    }

    public NumericKeypadView setHintText(String text) {
        return this;
    }

    public NumericKeypadView setTvHintSize(float textSize) {
        return this;
    }

    public NumericKeypadView setTvHintColor(int textColor) {
        return this;
    }

    public NumericKeypadView cleanAllTv() {
        strPass = "";
        intPassArr.clear();
        return this;
    }
}

view_numeric_keypad.xml

<?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="match_parent">

    <GridView
        android:id="@+id/gv_pass"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp300dp"
        android:horizontalSpacing="@dimen/dp6dp"
        android:numColumns="3"
        android:verticalSpacing="@dimen/dp6dp" />

</RelativeLayout>

在 Activity 中获取键盘的输入结果:

private void initView() {
    numericKeypadView = findViewById(R.id.safe_check_keypad);

    numericKeypadView.setKeypadClickListener(
            new NumericKeypadView.OnKeypadClickListener() {
                @Override
                public void onPass(List<Integer> list) {
                    StringBuilder phone = new StringBuilder();
                    for (Integer key : list) {
                        phone.append(key);
                    }
                    // authCodeView 是一个自定义的验证码输入框
                    authCodeView.setText(phone.toString());
                }

                // 输入指定个数后回调 onPassFinish
                @Override
                public void onPassFinish(List<Integer> list) {
                    StringBuilder phone = new StringBuilder();
                    for (Integer key : list) {
                        phone.append(key);
                    }
                    
                }
            });
}

authCodeView 自定义验证码输入框在下面这篇文章中
https://www.jianshu.com/p/a5182abdff06

相关文章

网友评论

      本文标题:软键盘

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