业务需求自定义数字键盘,写了一个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 stub this.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; } @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub int 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; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.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; @Override public int getCurrentView() { // TODO Auto-generated method stub return R.layout.activity_main; } @Override public void initView() { // TODO Auto-generated method stub initPopupWindow(); PopupWindowUtil.getInstance().setOnTouchListener(editText, mPopupWindow, this); } @Override public void showPopuWindow() { // TODO Auto-generated method stub super.showPopuWindow(); StartPopupWindow(parent); } @Override public void dismiss() { // TODO Auto-generated method stub super.dismiss(); StopPopupWindow(); } @Override public void delete() { // TODO Auto-generated method stub super.delete(); if(editText.getText().toString().trim().length()>0){ deleteEditValue(editText, getEditSelection(editText)); } } @Override public void addString(String str) { // TODO Auto-generated method stub super.addString(str); addString(editText, str); } }
基本代码就这些,如果需要密码键盘(纯数字),添加一个addString 参数的回调即可。隐藏系统键盘在高版本无法隐藏,最后换了一种思路,直接禁止了系统输入法的弹出 InputType.TYPE_NULL ,遗留问题:光标定位 OnTouchListener时将光标定位到处摸位置待解决
时间: 2024-11-06 03:53:27