iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android如何实现仿微信数字键盘
  • 867
分享到

Android如何实现仿微信数字键盘

2023-06-15 07:06:20 867人浏览 泡泡鱼
摘要

这篇文章主要介绍了Android如何实现仿微信数字键盘,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、图示效果二、需要考虑的问题布局的实现方式;demo中使用了popupw

这篇文章主要介绍了Android如何实现仿微信数字键盘,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、图示效果

Android如何实现仿微信数字键盘

二、需要考虑的问题

布局的实现方式;
demo中使用了popupwindow,通过xml文件进行Tablayout布局。

禁掉EditText默认软键盘的弹出,替换为自定义的数字键盘及与其它EditText切换焦点时的弹出效果;

删除和增加字符时需要同步更新光标的位置;

随机数字分布的实现;

三、实现代码

MainActivity调用处代码:

public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    private EditText numberEt;    private KeyboardPopupWindow keyboardPopupWindow;    private boolean isUiCreated = false;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        numberEt = findViewById(R.id.numberEt);        keyboardPopupWindow = new KeyboardPopupWindow(MainActivity.this, getWindow().getDecorView(), numberEt,true);//        numberEt.setInputType(InputType.TYPE_NULL);//该设置会导致光标不可见        numberEt.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (keyboardPopupWindow != null) {                    keyboardPopupWindow.show();                }            }        });        numberEt.setOnFocusChangeListener(new View.OnFocusChangeListener() {            @Override            public void onFocusChange(View v, boolean hasFocus) {                if (keyboardPopupWindow != null && isUiCreated) {//isUiCreated 很重要,Unable to add window -- token null is not valid; is your activity running?                    keyboardPopupWindow.refreshKeyboardOutSideTouchable(!hasFocus);// 需要等待页面创建完成后焦点变化才去显示自定义键盘                }                if (hasFocus) {//隐藏系统软键盘                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);                    imm.hideSoftInputFromWindow(numberEt.getWindowToken(), 0);                }            }        });    }    @Override    public void onWindowFocusChanged(boolean hasFocus) {        super.onWindowFocusChanged(hasFocus);        isUiCreated = true;    }    @Override    protected void onDestroy() {        if (keyboardPopupWindow != null) {            keyboardPopupWindow.releaseResources();        }        super.onDestroy();    }}

可以看到,这块的代码实现很简单,主要是通过KeyboardPopupWindow 这个自定义的View来实现键盘弹出及按键点击效果。需要注意的是isUiCreated 这个标志位,需要通过onWindowFocusChanged等方法来确定当前页面加载完毕后去刷新自定义键盘的状态,否则会报错。

自定义数字键盘的代码:

public class KeyboardPopupWindow extends PopupWindow {    private static final String TAG = "KeyboardPopupWindow";    private Context context;    private View anchorView;    private View parentView;    private EditText editText;    private boolean isRandomSort = false;//数字是否随机排序    private List<Integer> list = new ArrayList<>();    private int[] commonButtonIds = new int[]{R.id.button00, R.id.button01, R.id.button02, R.id.button03,            R.id.button04, R.id.button05, R.id.button06, R.id.button07, R.id.button08, R.id.button09};        public KeyboardPopupWindow(Context context, View anchorView, EditText editText, boolean isRandomSort) {        this.context = context;        this.anchorView = anchorView;        this.editText = editText;        this.isRandomSort = isRandomSort;        if (context == null || anchorView == null) {            return;        }        initConfig();        initView();    }    private void initConfig() {        setOutsideTouchable(false);        setFocusable(false);        setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));        forbidDefaultSofTKEyboard();    }        private void forbidDefaultSoftKeyboard() {        if (editText == null) {            return;        }        if (android.os.Build.VERSioN.SDK_INT > 10) {//4.0以上,使用反射的方式禁止系统自带的软键盘弹出            try {                Class<EditText> cls = EditText.class;                Method setShowSoftInputOnFocus;                setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);                setShowSoftInputOnFocus.setAccessible(true);                setShowSoftInputOnFocus.invoke(editText, false);            } catch (Exception e) {                e.printStackTrace();            }        }    }        public void refreshKeyboardOutSideTouchable(boolean isTouchable) {        setOutsideTouchable(isTouchable);        if (!isTouchable) {            show();        } else {            dismiss();        }    }    private void initView() {        parentView = LayoutInflater.from(context).inflate(R.layout.keyboadview, null);        initKeyboardView(parentView);        setWidth(ViewGroup.LayoutParams.MATCH_PARENT);        setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);        setContentView(parentView);    }    private void initKeyboardView(View view) {        LinearLayout dropdownLl = view.findViewById(R.id.dropdownLl);        dropdownLl.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                dismiss();            }        });        //①给数字键设置点击监听        for (int i = 0; i < commonButtonIds.length; i++) {            final Button button = view.findViewById(commonButtonIds[i]);            button.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    int curSelection = editText.getSelectionStart();                    int length = editText.getText().toString().length();                    if (curSelection < length) {                        String content = editText.getText().toString();                        editText.setText(content.substring(0, curSelection) + button.getText() + content.subSequence(curSelection, length));                        editText.setSelection(curSelection + 1);                    } else {                        editText.setText(editText.getText().toString() + button.getText());                        editText.setSelection(editText.getText().toString().length());                    }                }            });        }        //②给小数点按键设置点击监听        view.findViewById(R.id.buttonDot).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                int curSelection = editText.getSelectionStart();                int length = editText.getText().toString().length();                if (curSelection < length) {                    String content = editText.getText().toString();                    editText.setText(content.substring(0, curSelection) + "." + content.subSequence(curSelection, length));                    editText.setSelection(curSelection + 1);                } else {                    editText.setText(editText.getText().toString() + ".");                    editText.setSelection(editText.getText().toString().length());                }            }        });        //③给叉按键设置点击监听        view.findViewById(R.id.buttonCross).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                int length = editText.getText().toString().length();                int curSelection = editText.getSelectionStart();                if (length > 0 && curSelection > 0 && curSelection <= length) {                    String content = editText.getText().toString();                    editText.setText(content.substring(0, curSelection - 1) + content.subSequence(curSelection, length));                    editText.setSelection(curSelection - 1);                }            }        });    }    public void show() {        if (!isshowing() && anchorView != null) {            doRandomSortOp();            this.showAtLocation(anchorView, Gravity.BOTTOM, 0, 0);        }    }        private void doRandomSortOp() {        if (parentView == null) {            return;        }        if (!isRandomSort) {            for (int i = 0; i < commonButtonIds.length; i++) {                final Button button = parentView.findViewById(commonButtonIds[i]);                button.setText("" + i);            }        } else {            list.clear();            Random ran = new Random();            while (list.size() < commonButtonIds.length) {                int n = ran.nextInt(commonButtonIds.length);                if (!list.contains(n))                    list.add(n);            }            for (int i = 0; i < commonButtonIds.length; i++) {                final Button button = parentView.findViewById(commonButtonIds[i]);                button.setText("" + list.get(i));            }        }    }    public void releaseResources() {        this.dismiss();        context = null;        anchorView = null;        if (list != null) {            list.clear();            list = null;        }    }  }

代码实现的逻辑相对简单:

  1. 通过给popupwindow设置contentView、弹出位置、边界外触摸参数等数值,实现大体样式上的效果;

  2. 给contentView中的每个button设置点击事件,并处理传递的EditText数值及焦点变化情况;

  3. 设置随机标志位,进行数值键盘数值随机的分布;

  4. forbidDefaultSoftKeyboard中处理:禁止EditText默认的软键盘弹出。因为要实现EditText焦点仍旧可见的效果,目前试过的其它集中方式仍有较大的缺陷,所以是通过反射的方法来达到目的。

感谢你能够认真阅读完这篇文章,希望小编分享的“Android如何实现仿微信数字键盘”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Android如何实现仿微信数字键盘

本文链接: https://www.lsjlt.com/news/278616.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android如何实现仿微信数字键盘
    这篇文章主要介绍了Android如何实现仿微信数字键盘,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、图示效果二、需要考虑的问题布局的实现方式;demo中使用了popupw...
    99+
    2023-06-15
  • Android 仿微信数字键盘
    目录一、图示效果二、需要考虑的问题三、实现代码四.小结一、图示效果 二、需要考虑的问题 布局的实现方式; demo中使用了popupwindow,通过xml文件进行Tablayou...
    99+
    2024-04-02
  • Android如何实现仿微信@好友功能
    这篇文章主要介绍Android如何实现仿微信@好友功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!先上个效果图就是这么个功能1. 分析需求输入@跳转到联系人界面,选中一个或者多个好友返回到当前界面按退格键删除整块内...
    99+
    2023-05-30
    android
  • android 仿微信demo——微信主界面实现
    目录主界面实现测试总结 以往文章中实现微信启动页,登录注册功能,此基础上继续完善仿微信功能。 主界面实现 (1)整体采用RelativeLayout相对布局 (2)最上面是too...
    99+
    2024-04-02
  • android 仿微信demo——微信启动界面实现
    目录微信启动界面创建项目微信启动界面实现测试总结微信启动界面 创建项目 android studio创建移动端项目 微信启动界面实现 当第一次点击微信时会看到微信出现启动界...
    99+
    2024-04-02
  • android如何实现仿微信通讯录搜索
    这篇文章将为大家详细讲解有关android如何实现仿微信通讯录搜索,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:先看效果图字母索引搜索匹配二:功能分析1:汉字转拼音通讯录汉字转拼音(首个字符当考虑姓氏...
    99+
    2023-05-30
    android
  • Android自定义键盘的实现(数字键盘和字母键盘)
    在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘。本文主要讲述数字键盘和字母键盘的自定义实现。项目地址:https://github.com/xudjx/djkeyboard键盘效果:自定义键盘...
    99+
    2023-05-30
    android 数字键盘 字母键盘
  • Android如何实现仿微信右滑返回功能
    这篇文章将为大家详细讲解有关Android如何实现仿微信右滑返回功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先上效果图,如下:先分析一下功能的主要技术点,右滑即手势判断,当滑到一直距离时才执行返回,...
    99+
    2023-05-30
    android
  • Android如何实现仿微信Viewpager-Fragment惰性加载
    这篇文章将为大家详细讲解有关Android如何实现仿微信Viewpager-Fragment惰性加载,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果如图:什么是lazy-loading呢?顾名思义就是在...
    99+
    2023-05-30
    android
  • Android如何实现数字九宫格软键盘
    这篇文章主要介绍了Android如何实现数字九宫格软键盘,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言一开始大概是这种需求组长说 要不搞一个自定义软键盘吧 数字搞大点 方...
    99+
    2023-06-15
  • Android ListView实现仿微信聊天界面
    本篇内容主要讲解“Android ListView实现仿微信聊天界面”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android ListView实现仿微信聊天界面”吧!Android List...
    99+
    2023-06-20
  • Android仿微信布局的实现示例
    目前没有实现微信的功能,只是对微信的各个界面的调动以及对通讯录,发现和我中各个按钮的设置,同时如果你想尝试给微信中各个按钮背后添加功能时间可以用此作为模板哦,如拍照,朋友圈的添加都可...
    99+
    2024-04-02
  • android 仿微信demo——微信消息界面实现(移动端)
    目录移动端微信消息页实现总结移动端微信消息页实现 在上一篇中主界面实现说过微信四个页面中间都是是fragment的,并且四个fragment的布局都还没实现,所以这一篇主要实现微信...
    99+
    2024-04-02
  • android 仿微信demo——微信消息界面实现(服务端)
    目录服务端微信消息页实现测试总结 上一篇实现了移动端微信消息界面功能,以此为基础继续完善服务端功能 服务端微信消息页实现 微信消息界面的实现,和登录,注册是类似的,无非就是接受客...
    99+
    2024-04-02
  • 微信小程序如何实现车牌键盘
    这篇文章主要介绍“微信小程序如何实现车牌键盘”,在日常操作中,相信很多人在微信小程序如何实现车牌键盘问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”微信小程序如何实现车牌键盘”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-02
  • Android 实现数字九宫格软键盘
    目录前言需求实现效果GIF实现代码使用方法前言 一开始大概是这种 需求 组长说 要不搞一个自定义软键盘吧 数字搞大点 方便外卖员输入数字 我设置了输入EditText的输入格式为...
    99+
    2024-04-02
  • Android如何实现仿微信朋友圈全文、收起功能
    小编给大家分享一下Android如何实现仿微信朋友圈全文、收起功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果图具体代码(详细解释在代码注释中都有,这里就省...
    99+
    2023-05-30
    android
  • Android微信小程序如何实现猜数字小游戏
    这篇文章主要介绍“Android微信小程序如何实现猜数字小游戏”,在日常操作中,相信很多人在Android微信小程序如何实现猜数字小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android微信小程序如...
    99+
    2023-06-25
  • android 仿微信demo——注册功能实现(移动端)
    目录移动端注册功能实现测试总结移动端注册功能实现 微信的注册界面每一个文本段都有下划线且默认颜色都是灰色,当其中一个文本段获取焦点会将下划线的颜色变为绿色,而且文本输入框的光标也是绿...
    99+
    2024-04-02
  • android 仿微信demo——注册功能实现(服务端)
    目录服务端注册功能实现创建项目创建web层和客户端完成数据交互创建service层处理业务逻辑功能创建dao层操作数据库通过JDBC工具类访问数据库mysql中创建数据库和表测试总结...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作