<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
网友评论