利用反射修改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);
}
posted @ 2012-06-07 15:02  lipeil  阅读(569)  评论(0编辑  收藏  举报