我們在對View
執(zhí)行toString()
方法的時候,會看到一段輸出:
*****.View {33df71a V.E...... ......I. 0,0-0,0 #7f100102 app:id/view}
一般對象的toString
輸出是一段hashCode
白群,而 View 的輸出是這么一串的東西序宦,它是不是有意義呢缸逃?我們就來看下View
的toString
方法的實現(xiàn)贷盲。
今天的主角是這一個方法:
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
的一些狀態(tài)都標(biāo)明好了,這對我們 debug 非常有幫助轰异,我們來簡單看一下里面的內(nèi)容:
先是 用一對括號{}
把信息包起來
- 一段 hashcode
- 標(biāo)明
View
是否可見岖沛,值可選為V/I/G/.
,其中.
是意外情況搭独,一般不會有這種狀態(tài)出現(xiàn) - 標(biāo)明
View
是否可獲得焦點(diǎn)(Focusable)婴削,值可選為F/.
- 標(biāo)明
View
是否可用(Enable),值可選為E/.
- 標(biāo)明
View
是否需要繪制(WillNotDraw)牙肝,值可選為D/.
- 標(biāo)明
View
的橫向滾動條是否顯示唉俗,值可選為H/.
- 標(biāo)明
View
的縱向滾動條是否顯示,值可選為Z/.
- 標(biāo)明
View
是否可點(diǎn)擊(Clickable)配椭,值可選為C/.
- 標(biāo)明
View
是否可長按(Long Clickable)虫溜,值可選為L/.
- 標(biāo)明
View
是否可按出上下文菜單(鼠標(biāo)右鍵點(diǎn)擊,Context Clickable)股缸,值可選為X/.
- 標(biāo)明
View
是否在根命名空間中(Android內(nèi)部使用)衡楞,值可選為R/.
- 標(biāo)明
View
是否獲得焦點(diǎn)(Focused),值可選為F/.
- 標(biāo)明
View
是否是選擇狀態(tài)(Selected)敦姻,值可選為S/.
- 標(biāo)明
View
是否是預(yù)按下的狀態(tài)瘾境,值可選為p/.
- 標(biāo)明
View
是否是按下的狀態(tài),值可選為P/.
- 標(biāo)明
View
是否是 Hover 的狀態(tài)镰惦,值可選為H/.
- 標(biāo)明
View
是否是 Active 的狀態(tài)迷守,值可選為A/.
- 標(biāo)明
View
是否是 Invalidate 的狀態(tài),值可選為I/.
- 標(biāo)明
View
是否是 Dirty 的狀態(tài)陨献,值可選為D/.
- 接下去是一個空格,然后是
View
的尺寸坐標(biāo)信息:left,top-right,bottom
- 最后一個就是 ID 信息懂更,如果是應(yīng)用定義的 ID 就是
app:id/xxxx
當(dāng)然眨业,如果你需要 Debug 一些 View 狀態(tài)的話,記住這個順序沮协,和字母代表的意思龄捡,就可以一眼看到View
的狀態(tài),是非常不錯的慷暂。