Android中一些细碎问题的严肃探究

一直以来,andorid开发中会面临各种小问题,比如使用在某处为了图方便用了static修饰符是否合适?明明重写了onTouch()方法,却无法被系统调用,或者只匆匆调用一次完事。又比如有时候明明调用了系统API,键盘却还是无法正常显示.....这一切的背后,到底是人性的扭曲还是道德的沦丧.........,好,我们开始。

键盘显示问题

关于键显示的问题,有如下几个api接口:
第一类

  boolean   showSoftInput(View view, int flags)
  boolean   showSoftInput(View view, int flags, ResultReceiver resultReceiver)

网上大多吐槽这个这类api有问题,我们看看api对于第一个参数的描述:

  • @param view The currently focused view, which would like to receive soft keyboard input.

稍微解释一下,就是当前的view应当是已经获得焦点的,并且是可以接受输入,也就是说当前的view应该是EditText或者是其子类才对。你传个button是交不了货的。

第二类api

1   void   toggleSoftInput(int showFlags, int hideFlags)
2   void  toggleSoftInputFromWindow(IBinder windowToken, int showFlags, int hideFlags)

网上往往说这个api可行,可以正常显示键盘,我们看看api的描述:

  • This method toggles the input method window display.
    If the input window is already displayed, it gets hidden.
    If not the input window will be displayed.
    如果键盘没显示,那么就显示,否则就隐藏键盘。(由于参数是一些标志,所以没有什么坑)。也就是说,这个键盘的显示是跟当前界面组件基本没有什么关系。

两种方式推荐第一种。

static 修饰符的使用

Android开发中,使用static修饰字段或者方法的情况并不少见,而static修饰的东西的特性如下:

  • 修饰的变量,方法只属于类,并且在类加载阶段就读入内存
  • 有独立的内存区域,该类的对象实例共享一个静态变量。(一般的对象变量会随着每个对象的创建而copy一份)
  • static修饰的代码块,在类加载阶段执行一次。
  • static修饰的对象生命周期很长

用static修饰的字段或方法是很容易调用的,但者绝对不是使用static的理由,

  • 一旦使用static修饰类中的某个对象,也就意味着,即使类的对象实例被回收了,类中静态对象依然存在。
  • 一旦使用static修饰变量,也就意味着,你准备好了当一个对象的实例修改了变量,那么另一个对象也会被影响。
  • 一旦使用static修饰方法,那么也就意味着方法内部不能使用this,不能调用非静态方法(对象实例的方法);

与这个相关的还有final private 等等,虽然他们的作用都很清楚,但是在项目应用中,他们的应用场景未必是清晰的,有机会,我会想去整理这一块的内容。

onTouch()方法异常

在实际使用中,我们可能用它做一些手势判断等等操作,但是有时候ACTION_DOWN被调用一次之后,就没有下文了。
这往往是因为你在重写的方法中,返回了false,这意味着你不消费事件,那么系统在把ACTION_DOWN事件传给你之后,收到你的不消费该事件的提醒之后,后续的事件就不传给你了。这里主要是在事件分发中做的控制。关于源码分析,有兴趣的同学,可以查看《Android开发艺术探索》。

RecycleView的删除错乱

问题主要处在notifyItemMoved(int position)这些新的api中,主要是因为

  • Note that unlike ListView, RecyclerView will not call this method again if the position of the item changes in the data set unless the item itself is invalidated or the new position cannot be determined. For this reason, you should only use the position parameter while acquiring the related data item inside this method and should not keep a copy of it. If you need the position of an item later on (e.g. in a click listener), use getAdapterPosition() which will have the updated adapter position. Override onBindViewHolder(ViewHolder, int, List) instead if Adapter can handle effcient partial bind.

主要是告诉你,当adapter位置有变化的时候,使用getAdapterPosition()可以得到更新的变化,而onBindViewHolder()中的position并不会更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,842评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 源自古典《超级个体》33-2 很早看过这一篇,一直未总结。 这其实是个纠结的问题,人生在世,或多或少都有些爱好的,...
    阅修悟律阅读 374评论 0 2
  • 运动,学习… …有许多我必须做的去做!
    酿口三三阅读 145评论 0 0