android 自定义数字软键盘,Android 自定义数字键盘

本文介绍如何在Android中创建一个自定义数字键盘,并通过PopupWindow实现。代码示例展示了如何注入视图、监听点击事件,以及处理光标定位的问题。此外,还讨论了在高版本Android中隐藏系统键盘的挑战,并提出了一种解决方案:使用InputType.TYPE_NULL禁止系统输入法弹出。尽管如此,光标定位问题仍有待解决。
摘要由CSDN通过智能技术生成

业务需求自定义数字键盘,写了一个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时将光标定位到处摸位置待解决

原文:http://blog.csdn.net/anddroid_lanyan/article/details/45534579

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值