技术经验谈 技术经验谈
首页
  • 最佳实践

    • 抓包
    • 数据库操作
  • ui

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 总纲
  • 整体开发框架
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

hss01248

一号线程序员
首页
  • 最佳实践

    • 抓包
    • 数据库操作
  • ui

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 总纲
  • 整体开发框架
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 最佳实践

  • ui

    • android的activity布局玩法
    • ConstraintLayout玩法
    • EditText的setOnFocusListener无缝转变成addOnFocusListener
      • 方式一: jarfilter插件法
      • 方法2: 使用asm或者javaassist
    • webview被导航栏遮盖的处理
    • 输入框的下拉联想list
  • 优化

  • aop

  • apm

  • 架构

  • webview

  • rxjava

  • activity-fragment-view的回调和日志
  • Android加密相关
  • Android命令行操作
  • app后台任务
  • kotlin
  • kotlin漫谈
  • kotlin语言导论
  • sentry上传mapping.txt文件
  • so放于远程动态加载方案
  • states
  • Xposed模块开发
  • 一个关于manifest合并的猥琐操作
  • 玩坏android存储
  • 获取本app的安装来源信息
  • Android
  • ui
hss01248
2021-06-28
目录

EditText的setOnFocusListener无缝转变成addOnFocusListener

# 如何将EditText的setOnFocusListener无缝转变成addOnFocusListener的效果

# 方式一: jarfilter插件法

将AppCompatEditText源码拷贝出来,同样包名建立一个同名类

用增加以下方法

用jarfilter插件排除掉appcompact包里的AppCompatEditText即可

注意: 如果appcompact包升级了,要check一下AppCompatEditText源码是否有新的,如果有,再拷贝一次.

Set<OnFocusChangeListener> listeners = new LinkedHashSet<>();

/**
 * 实际效果=addOnXxxxListener
 * @param listener
 */
@Override
public void setOnFocusChangeListener(OnFocusChangeListener listener) {
    listeners.add(listener);
    super.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(listeners.size() >0){
                Iterator<OnFocusChangeListener> iterator = listeners.iterator();
                while (iterator.hasNext()){
                    OnFocusChangeListener next = iterator.next();
                    next.onFocusChange(v,hasFocus);
                }
            }
        }
    });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 方法2: 使用asm或者javaassist

给AppCompatEditText增加属性和方法.

属性和方法内容同上

参考

https://www.jianshu.com/p/609397fcac1a

# 方法三: 链式承接

调用onFocusChange之前,把别人设置的listener先调用一次,在调用自己的:

不如方法1

@Override
    public void setOnFocusChangeListener(OnFocusChangeListener listener) {
        OnFocusChangeListener preListener =  getOnFocusChangeListener();
        super.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(preListener != null){
                    preListener.onFocusChange(v, hasFocus);
                }
                listener.onFocusChange(v,hasFocus);
            }
        });
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
编辑 (opens new window)
上次更新: 2022/08/25, 20:20:31
ConstraintLayout玩法
webview被导航栏遮盖的处理

← ConstraintLayout玩法 webview被导航栏遮盖的处理→

最近更新
01
截图后的自动压缩工具
12-27
02
图片视频文件根据exif批量重命名
12-27
03
chatgpt图片识别描述功能
02-20
更多文章>
Theme by Vdoing | Copyright © 2020-2025 | 粤ICP备20041795号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式