摘要:我们在对执行方法的时候,会看到一段输出一般对象的输出是一段,而的输出是这么一串的东西,它是不是有意义呢我们就来看下的方法的实现。欢迎访问我的新博客地址
我们在对View执行toString()方法的时候,会看到一段输出:
*.View {33df71a V.E...... ......I. 0,0-0,0 #7f100102 app:id/view}
一般对象的toString输出是一段hashCode,而 View 的输出是这么一串的东西,它是不是有意义呢?我们就来看下View的toString方法的实现。
今天的主角是这一个方法:
public String toString() { StringBuilder out = new StringBuilder(128); out.append(getClass().getName()); out.append("{"); out.append(Integer.toHexString(System.identityHashCode(this))); out.append(" "); switch (mViewFlags&VISIBILITY_MASK) { case VISIBLE: out.append("V"); break; case INVISIBLE: out.append("I"); break; case GONE: out.append("G"); break; default: out.append("."); break; } out.append((mViewFlags&FOCUSABLE_MASK) == FOCUSABLE ? "F" : "."); out.append((mViewFlags&ENABLED_MASK) == ENABLED ? "E" : "."); out.append((mViewFlags&DRAW_MASK) == WILL_NOT_DRAW ? "." : "D"); out.append((mViewFlags&SCROLLBARS_HORIZONTAL) != 0 ? "H" : "."); out.append((mViewFlags&SCROLLBARS_VERTICAL) != 0 ? "V" : ".No"); out.append((mViewFlags&CLICKABLE) != 0 ? "C" : "."); out.append((mViewFlags&LONG_CLICKABLE) != 0 ? "L" : "."); out.append((mViewFlags&CONTEXT_CLICKABLE) != 0 ? "X" : "."); out.append(" "); out.append((mPrivateFlags&PFLAG_IS_ROOT_NAMESPACE) != 0 ? "R" : "."); out.append((mPrivateFlags&PFLAG_FOCUSED) != 0 ? "F" : "."); out.append((mPrivateFlags&PFLAG_SELECTED) != 0 ? "S" : "."); if ((mPrivateFlags&PFLAG_PREPRESSED) != 0) { out.append("p"); } else { out.append((mPrivateFlags&PFLAG_PRESSED) != 0 ? "P" : "."); } out.append((mPrivateFlags&PFLAG_HOVERED) != 0 ? "H" : "."); out.append((mPrivateFlags&PFLAG_ACTIVATED) != 0 ? "A" : "."); out.append((mPrivateFlags&PFLAG_INVALIDATED) != 0 ? "I" : "."); out.append((mPrivateFlags&PFLAG_DIRTY_MASK) != 0 ? "D" : "."); out.append(" "); out.append(mLeft); out.append(","); out.append(mTop); out.append("-"); out.append(mRight); out.append(","); out.append(mBottom); final int id = getId(); if (id != NO_ID) { out.append(" #"); out.append(Integer.toHexString(id)); final Resources r = mResources; if (id > 0 && Resources.resourceHasPackage(id) && r != null) { try { String pkgname; switch (id&0xff000000) { case 0x7f000000: pkgname="app"; break; case 0x01000000: pkgname="android"; break; default: pkgname = r.getResourcePackageName(id); break; } String typename = r.getResourceTypeName(id); String entryname = r.getResourceEntryName(id); out.append(" "); out.append(pkgname); out.append(":"); out.append(typename); out.append("/"); out.append(entryname); } catch (Resources.NotFoundException e) { } } } out.append("}"); return out.toString(); }
代码非常简单,从这里我们知道,toString 里面把View的一些状态都标明好了,这对我们 debug 非常有帮助,我们来简单看一下里面的内容:
先是 用一对括号{}把信息包起来
一段 hashcode
标明View是否可见,值可选为 V/I/G/.,其中.是意外情况,一般不会有这种状态出现
标明View是否可获得焦点(Focusable),值可选为F/.
标明View是否可用(Enable),值可选为E/.
标明View是否需要绘制(WillNotDraw),值可选为D/.
标明View的横向滚动条是否显示,值可选为H/.
标明View的纵向滚动条是否显示,值可选为Z/.
标明View是否可点击(Clickable),值可选为C/.
标明View是否可长按(Long Clickable),值可选为L/.
标明View是否可按出上下文菜单(鼠标右键点击,Context Clickable),值可选为X/.
标明View是否在根命名空间中(Android内部使用),值可选为R/.
标明View是否获得焦点(Focused),值可选为F/.
标明View是否是选择状态(Selected),值可选为S/.
标明View是否是预按下的状态,值可选为p/.
标明View是否是按下的状态,值可选为P/.
标明View是否是 Hover 的状态,值可选为H/.
标明View是否是 Active 的状态,值可选为A/.
标明View是否是 Invalidate 的状态,值可选为I/.
标明View是否是 Dirty 的状态,值可选为D/.
接下去是一个空格,然后是View的尺寸坐标信息:left,top-right,bottom
最后一个就是 ID 信息,如果是应用定义的 ID 就是app:id/xxxx
当然,如果你需要 Debug 一些 View 状态的话,记住这个顺序,和字母代表的意思,就可以一眼看到View的状态,是非常不错的。
欢迎访问我的新博客地址:https://geminiwen.xyz
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/13474.html
阅读 1696·2021-11-25 09:43
阅读 2930·2021-11-15 11:38
阅读 2561·2019-08-30 13:04
阅读 316·2019-08-29 11:07
阅读 1355·2019-08-26 18:37
阅读 2559·2019-08-26 14:07
阅读 483·2019-08-26 13:52
阅读 2162·2019-08-26 12:09