LayoutInflater.Factory 可以调试 布局,你把下面的代码放到
onCreate里面,然后再里面的下面的onCreateView里面加上断点,然后你就可以知道所有的view构造,所有的view的名字,不管是自定义还是系统的。
感觉挺不错的。
protected void setMenuBackGround() {
LayoutInflater layoutInflater = getLayoutInflater();
final LayoutInflater.Factory existingFactory = layoutInflater.getFactory();
// use introspection to allow a new Factory to be set
try {
Field field = LayoutInflater.class.getDeclaredField("mFactorySet");
field.setAccessible(true);
field.setBoolean(layoutInflater, false);
getLayoutInflater().setFactory(new LayoutInflater.Factory() {
@Override
public View onCreateView(String name, final Context context, AttributeSet attrs) {
if (name
.equalsIgnoreCase("android.support.v7.internal.view.menu.ListMenuItemView")) {
try {
LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View view = inflater.createView(name,
null, attrs);
new Handler().post(new Runnable() {
public void run() {
ViewParent parent = view.getParent();
((ViewGroup) parent).setBackgroundResource(R.color.test);
// view.setBackgroundResource(R.color.test);
}
});
return view;
} catch (InflateException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// do whatever you want with the null or non-null view
// such as expanding 'IconMenuItemView' and changing its style
// or anything else...
// and return the view
return null;
}
});
} catch (NoSuchFieldException e) {
// ...
} catch (IllegalArgumentException e) {
// ...
} catch (IllegalAccessException e) {
// ...
}
}
然后这个类也很强大,可以做很多事情,向下兼容。等等,替换东西等等。