View.toString()

我們在對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的狀態,是非常不錯的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,881評論 18 139
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,510評論 0 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,099評論 25 708
  • 接上一篇:Android藝術開發探索第三章————View的事件體系(上) 3.4 View 的事件分發機制 本節...
    kongjn閱讀 1,133評論 1 0
  • 人傻點好,為什么怎么說呢因為我就是一個非常好的例子,從我帶過軍訓以后每次和我的戰友們聊天,交流時我總是冒出一點...
    瀟灑杰哥閱讀 609評論 5 1