利用反射修改TextView 中的mPopup视图
public void reflect(EditText errorEdit) { try { /**获取TextView类中 mPopup的字段*/ Field popupField = TextView.class.getDeclaredField("mPopup"); popupField.setAccessible(true); /**获取字段 在 errorEdit对象中的值 , 即mPopup对象*/ Object popupObject = popupField.get(errorEdit); Class popupClass = null; /**获取 mPopup类*/ Class[] innerClasses = TextView.class.getDeclaredClasses(); for(Class innerClass :innerClasses) { String name = innerClass.getName(); System.out.println("-----innerClass---"+name); if(name.equals("android.widget.TextView$ErrorPopup")) { popupClass = innerClass; } } if(popupClass != null) { /**在mPopup类 中获取 mView 对象的字段*/ Field mViewField = popupClass.getDeclaredField("mView"); mViewField.setAccessible(true); /**在mPopup对象 中获取 mView 值(即mView对象)*/ TextView mView = (TextView)mViewField.get(popupObject); /**重新设置mView的背景图*/ mView.setBackgroundResource(R.drawable.pop_text_bg); } } catch (Exception e) { e.printStackTrace(); } }
需要注意的是我们不能在onCreate里面直接调用以上方法,因为那时mPopup View还没有初始化
我们可以在onClick中 触发该修改
如:
public void onClick(View view) { EditText errorEdit = (EditText) findViewById(R.id.error_edit); errorEdit.setError("the text is null"); reflect(errorEdit); }
或者
public void onWindowFocusChanged(boolean hasFocus)
{
// TODO Auto-generated method stub
super.onWindowFocusChanged(hasFocus);
}