Android 自定义数字键盘

业务需求自定义数字键盘,,写了一个demo

主要代码:

import android.app.Activity;import android.content.Context;import android.graphics.drawable.ColorDrawable;import android.util.DisplayMetrics;import android.view.View;import android.view.WindowManager;import android.view.ViewGroup.LayoutParams;import android.widget.EditText;import android.widget.ImageView;import android.widget.PopupWindow;import com.example.caculater.PopupWindowUtil.OnPopuWindowListener;import com.example.caculaternumber.R;import com.lidroid.xutils.ViewUtils;import com.lidroid.xutils.view.annotation.ViewInject;import com.lidroid.xutils.view.annotation.event.OnClick;public class CaculaterPopuWindow{private static Activity mActivity;private static CaculaterPopuWindow mPopupWindow;private String phone="";@ViewInject(R.id.caculater_del)private ImageView caculaterdel;@ViewInject(R.id.caculater_p)private ImageView caculaterp;@ViewInject(R.id.caculater_0)private ImageView caculater0;@ViewInject(R.id.caculater_1)private ImageView caculater1;@ViewInject(R.id.caculater_2)private ImageView caculater2;@ViewInject(R.id.caculater_3)private ImageView caculater3;@ViewInject(R.id.caculater_4)private ImageView caculater4;@ViewInject(R.id.caculater_5)private ImageView caculater5;@ViewInject(R.id.caculater_6)private ImageView caculater6;@ViewInject(R.id.caculater_7)private ImageView caculater7;@ViewInject(R.id.caculater_8)private ImageView caculater8;@ViewInject(R.id.caculater_9)private ImageView caculater9;@ViewInject(R.id.editText)private EditText editText;private OnPopuWindowListener listener;private int mScreenWidth;private int mScreenHeight;public CaculaterPopuWindow(){}public static CaculaterPopuWindow getInstance(Activity activity){mActivity=activity;if(mPopupWindow==null){mPopupWindow=new CaculaterPopuWindow();}return mPopupWindow;}public PopupWindow onCreate(OnPopuWindowListener listener) {// TODO Auto-generated method stubthis.listener=listener;View view=mActivity.getLayoutInflater().inflate(R.layout.include_caculater, null);ViewUtils.inject(this, view);initScreen();int height=mScreenHeight/3;PopupWindow pw=new PopupWindow(view,LayoutParams.MATCH_PARENT,height);pw.setBackgroundDrawable(new ColorDrawable(0));pw.setOutsideTouchable(true);return pw;}@OnClick({R.id.caculater_0,R.id.caculater_1,R.id.caculater_2,R.id.caculater_3,R.id.caculater_4,R.id.caculater_5,R.id.caculater_6,R.id.caculater_7,R.id.caculater_8,R.id.caculater_9,R.id.caculater_p,R.id.caculater_del})private void clickMethod(View v){if(v==caculaterdel){listener.delete();}else{if(v==caculater0){phone="0";}else if(v==caculater1){phone="1";}else if(v==caculater2){phone="2";}else if(v==caculater3){phone="3";}else if(v==caculater4){phone="4";}else if(v==caculater5){phone="5";}else if(v==caculater6){phone="6";}else if(v==caculater7){phone="7";}else if(v==caculater8){phone="8";}else if(v==caculater9){phone="9";}else if(v==caculaterp){phone=".";}listener.addString(phone);}}public void initScreen(){WindowManager manager=(WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics=new DisplayMetrics();manager.getDefaultDisplay().getMetrics(outMetrics);mScreenWidth=outMetrics.widthPixels;mScreenHeight=outMetrics.heightPixels;}

import android.text.InputType;import android.view.MotionEvent;import android.view.View;import android.widget.EditText;import android.widget.PopupWindow;public class PopupWindowUtil implements android.view.View.OnTouchListener{private static PopupWindowUtil util;private EditText mEditText;private PopupWindow mPopuWindow;private OnPopuWindowListener listener;public PopupWindowUtil(){}public static PopupWindowUtil getInstance(){if(util==null){util=new PopupWindowUtil();}return util;}public void setOnTouchListener(EditText mEditText,PopupWindow mPopuWindow,OnPopuWindowListener listener){mEditText.setOnTouchListener(this);this.mEditText=mEditText;this.mPopuWindow=mPopuWindow;this.listener=listener;}@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubint inputType=mEditText.getInputType();mEditText.setInputType(InputType.TYPE_NULL);mEditText.setInputType(inputType);mEditText.setSelection(mEditText.getText().toString().trim().length());if(mPopuWindow!=null&&!mPopuWindow.isShowing()){listener.showPopuWindow();}return false;}public interface OnPopuWindowListener{void showPopuWindow();void dismiss();void addString(String str);void delete();}import android.app.Activity;import android.os.Bundle;import android.view.Gravity;import android.view.View;import android.widget.EditText;import android.widget.PopupWindow;import com.example.caculater.PopupWindowUtil.OnPopuWindowListener;import com.lidroid.xutils.ViewUtils;public abstract class BaseActivity extends Activity implements OnPopuWindowListener{protected PopupWindow mPopupWindow;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(getCurrentView());ViewUtils.inject(this);initView();}public abstract int getCurrentView();public abstract void initView();public void initPopupWindow(){if(mPopupWindow==null){mPopupWindow=CaculaterPopuWindow.getInstance(this).onCreate(this);}}public void StartPopupWindow(View view){if(mPopupWindow!=null&&!mPopupWindow.isShowing()){mPopupWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0);}}public void StopPopupWindow(){ if(mPopupWindow!=null&&mPopupWindow.isShowing()){mPopupWindow.dismiss();}}// 往文本框中添加内容public void addString(EditText editText,String sequence) {int index = getEditSelection(editText);// 光标的位置if (index < 0 || index >= getEditTextViewString(editText).length()) {editText.append(sequence);} else {editText.getEditableText().insert(index, sequence);// 光标所在位置插入文字}}// 获取光标当前位置public int getEditSelection(EditText editText) {return editText.getSelectionStart();}// 获取文本框的内容public String getEditTextViewString(EditText editText) {return editText.getText().toString();}// 清除文本框中的内容public void clearText(EditText editText) {editText.getText().clear();}// 删除指定位置的字符public void deleteEditValue(EditText editText,int index) {editText.getText().delete(index – 1, index);}// 设置光标位置public void setEditSelectionLoc(EditText editText,int index) {editText.setSelection(index);}// 判断是否是数字public static boolean isNum(String str) {return str.matches("([0-9]+)?)$");}public void showPopuWindow(){}public void dismiss(){}public void addString(String str){}public void delete(){}}import android.widget.EditText;import android.widget.LinearLayout;import com.example.caculater.BaseActivity;import com.example.caculater.PopupWindowUtil;import com.lidroid.xutils.view.annotation.ViewInject;public class MainActivity extends BaseActivity {@ViewInject(R.id.editText)private EditText editText;@ViewInject(R.id.parent)private LinearLayout parent;@Overridepublic int getCurrentView() {// TODO Auto-generated method stubreturn R.layout.activity_main;}@Overridepublic void initView() {// TODO Auto-generated method stubinitPopupWindow();PopupWindowUtil.getInstance().setOnTouchListener(editText, mPopupWindow, this);}@Overridepublic void showPopuWindow() {// TODO Auto-generated method stubsuper.showPopuWindow();StartPopupWindow(parent);}@Overridepublic void dismiss() {// TODO Auto-generated method stubsuper.dismiss();StopPopupWindow();}@Overridepublic void delete() {// TODO Auto-generated method stubsuper.delete();if(editText.getText().toString().trim().length()>0){deleteEditValue(editText, getEditSelection(editText));}}@Overridepublic void addString(String str) {// TODO Auto-generated method stubsuper.addString(str);addString(editText, str);}}基本代码就这些,如果需要密码键盘(纯数字),添加一个addString 参数的回调即可。隐藏系统键盘在高版本无法隐藏,最后换了一种思路,直接禁止了系统输入法的弹出 InputType.TYPE_NULL ,遗留问题:光标定位 OnTouchListener时将光标定位到处摸位置待解决

你在潮湿的风中感受到了平稳的呼吸,多好听啊,

Android 自定义数字键盘

相关文章:

你感兴趣的文章:

标签云: