博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 平板中 自己定义键盘(popuwindow) 居于屏幕左下方 仿微信的password输入界面...
阅读量:5876 次
发布时间:2019-06-19

本文共 15554 字,大约阅读时间需要 51 分钟。

      之前博客中,介绍过使用谷歌提供的键盘的一些api,能够非常好地自己定义键盘,參考我之前的博客链接: ,这个有一个局限性,仅仅能占满屏幕,无法做到仅仅能占一部分的需求键盘,例如以下图我平板中的键盘需求:(因为公司保密须要,所以比較恐怖一点,嘿嘿)

     相似于上方的左下角的一小块键盘,这就不能使用系统自带的一些键盘api,须要自己写布局,而且对输入的金额进行位数的限制,以及一些栏位输入的整数和小数位的控制,总体的实现过程例如以下;

1.点击某个edittext,弹出下方的键盘(也就是使用popuwindow的方式),须要监听edittext获得焦点以及点击的事件,还须要隐藏掉系统自带的键盘,例如以下:

limitEditText = (EditText) fragmentLayout.findViewById(R.id.ordertrade_limit_price);				//禁止系统键盘弹出		MainActionUtilHelper.hideSoftInputMethod(limitEditText, getActivity());		digit = allone.verbank.apad.client.util.InstrumentUtil.getDigitByInstrument(instName);		limitEditText.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener() {			@Override			public void onFocusChange(View v, boolean hasFocus) {				if (hasFocus) {					if (popupMenu != null) {						popupMenu.destroyPopupMenu();					}					popupMenu = PopupMenuFactory.createPopupWindowKeyBoard(getActivity(), limitEditText, order_amount_layout,							IPopupMenu.MENU_TYPE_JPY, digit == 2, digit);					popupMenu.showPopupMenu();					popupMenu.createPupupWindow().setOnDismissListener(new PopupWindow.OnDismissListener() {						@Override						public void onDismiss() {						}					});				} else {					// 此处为失去焦点时的处理内容				}			}		});		//监听弹出数字键盘		limitEditText.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View vi) {				if (popupMenu != null) {					popupMenu.destroyPopupMenu();				}				// 浮出菜单				popupMenu = PopupMenuFactory.createPopupWindowKeyBoard(getActivity(), limitEditText, order_amount_layout,						IPopupMenu.MENU_TYPE_JPY, digit == 2, digit);				popupMenu.showPopupMenu();				popupMenu.createPupupWindow().setOnDismissListener(new PopupWindow.OnDismissListener() {					@Override					public void onDismiss() {					}				});			}		});		//======================================================================================
       (2)隐藏系统自带的键盘,方法例如以下,须要传入activity和edittext控件,例如以下代码:
/**	 * 隐藏系统键盘	 * 	 * @param ed	 * @author qiulinhe	 * @createTime 2016年5月31日 下午1:50:33	 */	public static void hideSoftInputMethod(EditText ed, Activity activity) {		activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);		int currentVersion = android.os.Build.VERSION.SDK_INT;		String methodName = null;		if (currentVersion >= 16) {			// 4.2  			methodName = "setShowSoftInputOnFocus";		} else if (currentVersion >= 14) {			// 4.0  			methodName = "setSoftInputShownOnFocus";		}		if (methodName == null) {			ed.setInputType(InputType.TYPE_NULL);		} else {			Class
cls = EditText.class; Method setShowSoftInputOnFocus; try { setShowSoftInputOnFocus = cls.getMethod(methodName, boolean.class); setShowSoftInputOnFocus.setAccessible(true); setShowSoftInputOnFocus.invoke(ed, false); } catch (NoSuchMethodException e) { ed.setInputType(InputType.TYPE_NULL); e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }

     2.写好popuwindow的xml布局文件,也就是你须要呈现的键盘布局,xml文件例如以下:

   3.接着就是点击edittext时候,弹出popuwindow窗体的管理类了,例如以下代码:

package allone.verbank.apad.client.component.menu.impl;import allone.verbank.apad.client.R;import allone.verbank.apad.client.component.menu.IPopupMenu;import allone.verbank.apad.client.util.SharepreferencesUtilSystemSettings;import android.app.Activity;import android.graphics.drawable.ColorDrawable;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup.LayoutParams;import android.widget.Button;import android.widget.EditText;import android.widget.PopupWindow;import android.widget.TextView;import android.widget.Toast;/** * 数字键盘,点击edittext控件,下方弹出键盘 *  * @author qiulinhe * @createTime 2016年5月31日 上午10:33:20 */public class DigitKeyboardPopupMenu implements IPopupMenu {	private boolean isJPY;	private int digit;	//=============键盘数字初始化============	private TextView hide_keyboard;//隐藏键盘	private Button seven, eight, nine, first_selfdefine;//键盘的第一行	private Button four, five, six, second_selfdefine;//键盘的第一行	private Button one, two, three, three_selfdefine;//键盘的第一行	private Button double_zero, zero, donte, delete_btn;//键盘的第一行	private StringBuffer inputStringAdd = new StringBuffer();//用来存放输入数字的sb	//==========================================	private PopupWindow popupMenu;	private Activity activity;	private EditText sourceEditView;//输入的edittext,弹出键盘	private View keylinearlayout;//为了计算键盘的尺寸,传入布局	private int keyboardType;//键盘类型	public DigitKeyboardPopupMenu(Activity activity, View sourceEditView, View sourLayout, int keyboardType, boolean ifJPY,			int instrumentdigit) {		this.activity = activity;		this.sourceEditView = (EditText) sourceEditView;		this.keylinearlayout = sourLayout;		this.keyboardType = keyboardType;		this.isJPY = ifJPY;		this.digit = instrumentdigit;		initComponent();	}	private void initComponent() {		//当从键盘切换到还有一个键盘,又一次回来,须要获得原来的已经输入的字符串		inputStringAdd.append(sourceEditView.getText().toString());		View view = activity.getLayoutInflater().inflate(R.layout.small_keyboard, null);		// 创建弹出窗体		// 窗体内容为layoutLeft,里面包括一个ListView		// 窗体宽度跟tvLeft一样		popupMenu = new PopupWindow(view, keylinearlayout.getWidth(), LayoutParams.WRAP_CONTENT);		ColorDrawable cd = new ColorDrawable(R.color.white);		popupMenu.setBackgroundDrawable(cd);		popupMenu.setAnimationStyle(R.style.AnimBottom);		popupMenu.update();		popupMenu.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);		popupMenu.setTouchable(true); // 设置popupwindow可点击		popupMenu.setOutsideTouchable(true); // 设置popupwindow外部可点击		popupMenu.setFocusable(true); // 获取焦点		popupMenu.setTouchInterceptor(new View.OnTouchListener() {			@Override			public boolean onTouch(View v, MotionEvent event) {				// 假设点击了popupwindow的外部,popupwindow也会消失				if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {					popupMenu.dismiss();					return true;				}				return false;			}		});		//初始化键盘上的数字		initALLDig(view);	}	@Override	public PopupWindow createPupupWindow() {		return popupMenu;	}	@Override	public void showPopupMenu() {		if (popupMenu != null && popupMenu.isShowing()) {			popupMenu.dismiss();		} else {			//popupMenu.showAsDropDown(sourceEditView);			popupMenu.showAtLocation(keylinearlayout, Gravity.BOTTOM | Gravity.LEFT, 0, 0); //设置layout在PopupWindow中显示的位置 			// popupMenu.showAsDropDown(sourceView,			// Math.round(sourceView.getX()),			// (int) (sourceView.getY()));		}	}	@Override	public void destroyPopupMenu() {	}	/**	 * 初始化键盘上的全部数字,进行监听处理	 * 	 * @param view	 * @author qiulinhe	 * @createTime 2016年5月31日 下午2:24:34	 */	private void initALLDig(View view) {		// 自己定义输入金额key,2015年12月21日14:28:06:当用户点击自己定义金额。清除掉之前的内容,输入自己定义金额		final String selfdig20 = SharepreferencesUtilSystemSettings.getValue(activity, "amount2", "200,000");		final String selfdig50 = SharepreferencesUtilSystemSettings.getValue(activity, "amount5", "500,000");		final String selfdig100 = SharepreferencesUtilSystemSettings.getValue(activity, "amount10", "1,000,000");		//=====================第一行,隐藏键盘的button===============================		hide_keyboard = (TextView) view.findViewById(R.id.hide_keyboard);		hide_keyboard.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				popupMenu.dismiss();			}		});		//=================第二行,7,8,9,第一个自己定义金额=======================		seven = (Button) view.findViewById(R.id.seven);		seven.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(seven);			}		});		eight = (Button) view.findViewById(R.id.eight);		eight.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(eight);			}		});		nine = (Button) view.findViewById(R.id.nine);		nine.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(nine);			}		});		first_selfdefine = (Button) view.findViewById(R.id.first_selfdefine);		first_selfdefine.setText(selfdig20);		first_selfdefine.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//假设是输入为小数位,禁止自己定义金额点击				if (keyboardType == IPopupMenu.MENU_TYPE_JPY) {				} else {					String dValue = selfdig20;					dValue = dValue.replace(",", "");					selfDefAppendData(dValue);				}			}		});		//=================第二行4,5,6,第二个自己定义金额=======================		four = (Button) view.findViewById(R.id.four);		four.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(four);			}		});		five = (Button) view.findViewById(R.id.five);		five.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(five);			}		});		six = (Button) view.findViewById(R.id.six);		six.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(six);			}		});		second_selfdefine = (Button) view.findViewById(R.id.second_selfdefine);		second_selfdefine.setText(selfdig50);		second_selfdefine.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//假设是输入为小数位,禁止自己定义金额点击				if (keyboardType == IPopupMenu.MENU_TYPE_JPY) {				} else {					String dValue = selfdig50;					dValue = dValue.replace(",", "");					selfDefAppendData(dValue);				}			}		});		//=================第二行1,2,3,第三个自己定义金额=======================		one = (Button) view.findViewById(R.id.one);		one.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(one);			}		});		two = (Button) view.findViewById(R.id.two);		two.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(two);			}		});		three = (Button) view.findViewById(R.id.three);		three.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(three);			}		});		three_selfdefine = (Button) view.findViewById(R.id.three_selfdefine);		three_selfdefine.setText(selfdig100);		three_selfdefine.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//假设是输入为小数位,禁止自己定义金额点击				if (keyboardType == IPopupMenu.MENU_TYPE_JPY) {				} else {					String dValue = selfdig100;					dValue = dValue.replace(",", "");					selfDefAppendData(dValue);				}			}		});		//=================第二行00,0,.,第四个自己定义金额=======================		double_zero = (Button) view.findViewById(R.id.double_zero);		double_zero.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(double_zero);			}		});		zero = (Button) view.findViewById(R.id.zero);		zero.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//追加数字				inputAppendData(zero);			}		});		donte = (Button) view.findViewById(R.id.donte);		donte.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//当键盘为输入金额的时候,小数点不能点击				if (keyboardType == IPopupMenu.MENU_TYPE_AMOUNT) {					donte.setEnabled(false);				} else {					//假设已经有有一个小数点,则不能再点击					if (sourceEditView.getText().toString().contains(".")) {						donte.setEnabled(false);					} else {						//追加数字,仅仅能有一个小数点						inputAppendData(donte);					}				}			}		});		delete_btn = (Button) view.findViewById(R.id.delete_btn);		delete_btn.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				//删除功能				deleteAppendData();			}		});	}	/**	 * PV数字,进行追加	 * 	 * @author qiulinhe	 * @createTime 2016年5月31日 下午2:59:29	 */	private void inputAppendData(Button digBtn) {		//当键盘为输入金额的时候,小数点不能点击,且仅仅能输入7位数,不能输入小数		if (keyboardType == IPopupMenu.MENU_TYPE_AMOUNT) {			String oldValue = inputStringAdd.toString().trim();			String newValue = digBtn.getText().toString().trim();//千分位格式化			String dValue = oldValue + newValue;			if (!dValue.equals("") && dValue.length() > 7) {				Toast.makeText(activity, activity.getString(R.string.customdialogpricemodify_onlyseven), Toast.LENGTH_SHORT)						.show();			} else {				inputStringAdd.append(digBtn.getText().toString().trim());				sourceEditView.setText(inputStringAdd.toString().trim());				//设置光标位于最后一位				sourceEditView.setSelection(sourceEditView.getText().length());			}		} else if (keyboardType == IPopupMenu.MENU_TYPE_JPY) {//当商品含有JPY的,输入的数值:整数位最多为3位,小数位最多为2位			sourceEditView.setText(inputStringAdd.append(ifJPYReturnData(digBtn)));			//设置光标位于最后一位			sourceEditView.setSelection(sourceEditView.getText().length());		}	}	/**	 * 假设是JPY的,进行推断,返回数据	 * 	 * @param digBtn	 * @author qiulinhe	 * @createTime 2016年6月1日 上午10:45:19	 */	private String ifJPYReturnData(Button digBtn) {		String oriValue = inputStringAdd.toString().trim();		StringBuffer sb = new StringBuffer(oriValue);		sb.append(digBtn.getText().toString().trim());		String newValue = sb.toString();		String[] newValueVec = newValue.split("\\.");		if (newValueVec.length == 2) {			double number = Double.parseDouble(newValueVec[0]);			boolean numberflag = true;			if (isJPY) {				numberflag = ((number - 999 > 0.000001) ? false : true);			} else {				numberflag = ((number - 99 > 0.000001) ?

false : true); } boolean digitflag = true; try { String digitNumber = newValueVec[1]; digitflag = digitNumber.toCharArray().length > digit ?

false : true; } catch (Exception ex) { digitflag = false; } if (numberflag && digitflag) { return digBtn.getText().toString().trim(); } else { return ""; } } else { double value = Double.parseDouble(newValue); if (isJPY) { return value > 999 ?

"" : digBtn.getText().toString().trim(); } else { return value > 99 ? "" : digBtn.getText().toString().trim(); } } } /** * 删除功能 * * @author qiulinhe * @createTime 2016年5月31日 下午3:03:03 */ private void deleteAppendData() { //当键盘为输入金额的时候,小数点不能点击,且仅仅能输入7位数,不能输入小数 if (keyboardType == IPopupMenu.MENU_TYPE_AMOUNT) { String dValue = sourceEditView.getText().toString(); //格式化之后又一次赋值 inputStringAdd.setLength(0); inputStringAdd.append(dValue); if (inputStringAdd.length() - 1 >= 0) { inputStringAdd.delete(inputStringAdd.length() - 1, inputStringAdd.length()); sourceEditView.setText(inputStringAdd.toString().trim()); sourceEditView.setSelection(sourceEditView.getText().length()); } } else { if (inputStringAdd.length() - 1 >= 0) { inputStringAdd.delete(inputStringAdd.length() - 1, inputStringAdd.length()); sourceEditView.setText(inputStringAdd.toString().trim()); sourceEditView.setSelection(sourceEditView.getText().length()); } } } /** * 自己定义金额,输入自己定义金额时,将原来的界面清空,填入自己定义金额 * * @author qiulinhe * @createTime 2016年5月31日 下午3:04:02 */ private void selfDefAppendData(String selfData) { inputStringAdd.replace(0, inputStringAdd.length(), selfData); sourceEditView.setText(inputStringAdd.toString().trim()); sourceEditView.setSelection(sourceEditView.getText().length()); } }

上述的控制类中,就已经有一些关于限制金额的输入为7位数,限制有些输入的数据整数位3位/小数为2位的逻辑.非常多凝视已经加上,代码有些是不全的,所以有问题能够交流.

=========================2016年7月15日14:37:12,补充=========================

假设出现键盘遮挡的问题,能够套一层scrollview或者又一次设置listview的高度,例如以下链接:http://blog.csdn.net/nihaoqiulinhe/article/details/51917530

你可能感兴趣的文章
Spring构造方法注入类型歧义
查看>>
为什么 Java 不提供无符号类型呢?
查看>>
使用iTextSharp在Asp.Net中操作PDF系列文章 目录
查看>>
《Java 2 图形设计卷Ⅱ- SWING》第6章 实用工具
查看>>
C#开发微信门户及应用(37)--微信公众号标签管理功能
查看>>
前端优化带来的思考,浅谈前端工程化
查看>>
Mina2.0框架源码剖析(一)
查看>>
BZOJ 2456: mode(新生必做的水题)
查看>>
第 7 章 RethinkDB
查看>>
JDBC连接Oracle数据库
查看>>
Centos7设置关闭防火墙
查看>>
Linux usleep for shell
查看>>
【SQL Sever】安装过程
查看>>
外部中断实验
查看>>
python 回溯法 子集树模板 系列 —— 19、野人与传教士问题
查看>>
多线程之GCD(一)
查看>>
7.3. postForObject
查看>>
Nginx 学习笔记(四)nginx-module-vts模块
查看>>
thinkphp怎么实现图片验证码
查看>>
iOS - UISegmentedControl
查看>>