美文网首页week.io
View.toString()

View.toString()

作者: Gemini | 来源:发表于2017-02-21 15:54 被阅读21次

    我们在对View执行toString()方法的时候,会看到一段输出:

    *****.View {33df71a V.E...... ......I. 0,0-0,0 #7f100102 app:id/view}

    一般对象的toString输出是一段hashCode,而 View 的输出是这么一串的东西,它是不是有意义呢?我们就来看下ViewtoString方法的实现。

    今天的主角是这一个方法:

    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 非常有帮助,我们来简单看一下里面的内容:
    先是 用一对括号{}把信息包起来

    1. 一段 hashcode
    2. 标明View是否可见,值可选为 V/I/G/.,其中.是意外情况,一般不会有这种状态出现
    3. 标明View是否可获得焦点(Focusable),值可选为F/.
    4. 标明View是否可用(Enable),值可选为E/.
    5. 标明View是否需要绘制(WillNotDraw),值可选为D/.
    6. 标明View的横向滚动条是否显示,值可选为H/.
    7. 标明View的纵向滚动条是否显示,值可选为Z/.
    8. 标明View是否可点击(Clickable),值可选为C/.
    9. 标明View是否可长按(Long Clickable),值可选为L/.
    10. 标明View是否可按出上下文菜单(鼠标右键点击,Context Clickable),值可选为X/.
    11. 标明View是否在根命名空间中(Android内部使用),值可选为R/.
    12. 标明View是否获得焦点(Focused),值可选为F/.
    13. 标明View是否是选择状态(Selected),值可选为S/.
    14. 标明View是否是预按下的状态,值可选为p/.
    15. 标明View是否是按下的状态,值可选为P/.
    16. 标明View是否是 Hover 的状态,值可选为H/.
    17. 标明View是否是 Active 的状态,值可选为A/.
    18. 标明View是否是 Invalidate 的状态,值可选为I/.
    19. 标明View是否是 Dirty 的状态,值可选为D/.
    20. 接下去是一个空格,然后是View的尺寸坐标信息:left,top-right,bottom
    21. 最后一个就是 ID 信息,如果是应用定义的 ID 就是app:id/xxxx

    当然,如果你需要 Debug 一些 View 状态的话,记住这个顺序,和字母代表的意思,就可以一眼看到View的状态,是非常不错的。

    相关文章

      网友评论

        本文标题:View.toString()

        本文链接:https://www.haomeiwen.com/subject/nmjuwttx.html