The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks
          在實際開發中LayoutInflater這個類還是非常有用的,它的作用類似于findViewById()。不同點是LayoutInflater是用來找res/layout/下的xml布局文件,并且實例化;而findViewById()是找xml布局文件下的具體widget控件(如Button、TextView等)。
          具體作用:
          1、對于一個沒有被載入或者想要動態載入的界面,都需要使用LayoutInflater.inflate()來載入;
          2、對于一個已經載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。
          LayoutInflater 是一個抽象類,在文檔中如下聲明:
          public abstract class LayoutInflater extends Object
          獲得 LayoutInflater 實例的三種方式
          1. LayoutInflater inflater = getLayoutInflater();//調用Activity的getLayoutInflater() 
          2. LayoutInflater inflater = LayoutInflater.from(context);  
          3. LayoutInflater inflater =  (LayoutInflater)context.getSystemService
                                        (Context.LAYOUT_INFLATER_SERVICE);
          其實,這三種方式本質是相同的,從源碼中可以看出:
          getLayoutInflater():
          Activity 的 getLayoutInflater() 方法是調用 PhoneWindow 的getLayoutInflater()方法,看一下該源代碼:
          public PhoneWindow(Context context)
          {   
           super(context);   
              mLayoutInflater = LayoutInflater.from(context);
          }
          可以看出它其實是調用 LayoutInflater.from(context)。
          LayoutInflater.from(context):
          public static LayoutInflater from(Context context)
          {   
           LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService
                   (Context.LAYOUT_INFLATER_SERVICE);
              if (LayoutInflater == null)
              {       
               throw new AssertionError("LayoutInflater not found.");   
              }   
              return LayoutInflater;
          }
          可以看出它其實調用 context.getSystemService()。
          結論:所以這三種方式最終本質是都是調用的Context.getSystemService()。
          另外getSystemService()是Android很重要的一個API,它是Activity的一個方法,根據傳入的NAME來取得對應的Object,然后轉換成相應的服務對象。以下介紹系統相應的服務。
           
          傳入的Name  返回的對象 說明
          WINDOW_SERVICE WindowManager 管理打開的窗口程序
          LAYOUT_INFLATER_SERVICE LayoutInflater 取得xml里定義的view
          ACTIVITY_SERVICE ActivityManager 管理應用程序的系統狀態
          POWER_SERVICE PowerManger 電源的服務
          ALARM_SERVICE AlarmManager 鬧鐘的服務
          NOTIFICATION_SERVICE NotificationManager 狀態欄的服務
          KEYGUARD_SERVICE KeyguardManager 鍵盤鎖的服務
          LOCATION_SERVICE LocationManager 位置的服務,如GPS
          SEARCH_SERVICE SearchManager 搜索的服務
          VEBRATOR_SERVICE Vebrator 手機震動的服務
          CONNECTIVITY_SERVICE Connectivity 網絡連接的服務
          WIFI_SERVICE WifiManager Wi-Fi服務
          TELEPHONY_SERVICE TeleponyManager 電話服務
          inflate 方法
          通過 sdk 的 api 文檔,可以知道該方法有以下幾種過載形式,返回值均是 View 對象,如下:
          public View inflate (int resource, ViewGroup root) 
          public View inflate (XmlPullParser parser, ViewGroup root)
          public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)  
          public View inflate (int resource, ViewGroup root, boolean attachToRoot)
          示意代碼:
          LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);       
          View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));       
          //EditText editText = (EditText)findViewById(R.id.content);// error 
          EditText editText = (EditText)view.findViewById(R.id.content);
          對于上面代碼,指定了第二個參數 ViewGroup root,當然你也可以設置為 null 值。
          注意:
          ·inflate 方法與 findViewById 方法不同;
          ·inflater 是用來找 res/layout 下的 xml 布局文件,并且實例化;
          ·findViewById() 是找具體 xml 布局文件中的具體 widget 控件(如:Button、TextView 等)。
          posted on 2014-12-17 10:23 Eric_jiang 閱讀(199) 評論(0)  編輯  收藏 所屬分類: Android
          主站蜘蛛池模板: 印江| 昆明市| 博乐市| 堆龙德庆县| 双江| 轮台县| 甘南县| 恩平市| 延边| 新巴尔虎右旗| 宽甸| 昌图县| 汤原县| 博兴县| 东乌| 溧阳市| 西青区| 台南市| 宣武区| 兰州市| 得荣县| 潍坊市| 娄烦县| 宜川县| 宜昌市| 涿州市| 南澳县| 大丰市| 乐至县| 阿鲁科尔沁旗| 海原县| 吉安县| 百色市| 大关县| 左权县| 汤阴县| 巫山县| 延长县| 弥勒县| 兴仁县| 当雄县|