• 【转载】setContentView和inflate区别


    原文:http://blog.163.com/promise_wg/blog/static/18912001420116241062211/ (文糙理细……)

      一般用LayoutInflater做一件事:inflate

      inflate方法共有四种形式,目的都是把xml表述的layout转化为View对象。 其中有一个比较常用—— View inflate (int resource, ViewGroup root) 

      int resource,就是resource/layout文件在R文件中对应的ID,这个必须指定。 而ViewGroup root则可以是null,null时就只创建一个resource对应的View,不是null时,会将创建的view自动加为root的child。

    ##  setContentView和inflate区别:

        setContentView()一旦调用, layout就会立刻显示UI;而inflate只会把Layout形成一个以view类实现成的对象,有需要时再用setContentView(view)显示出来 一般在activity中通过setContentView()将界面显示出来,但是如果在非activity中如何对控件布局设置操作了,这需LayoutInflater动态加载

     1 <TextView 
     2     android:id="@+id/tview" 
     3     android:layout_width="fill_parent"       
     4     android:layout_height="wrap_content" 
     5     android:text="ATAAW.COM" /> 
     6 <Button 
     7     android:layout_width="fill_parent"     
     8     android:layout_height="wrap_content" 
     9     android:id="@+id/button" 
    10     android:text="按钮" />

    在程序中动态加载以上布局。

      LayoutInflater flater = LayoutInflater.from(this); View view = flater.inflate(R.layout.example, null);

    获取布局中的控件。

      button = (Button) view.findViewById(R.id.button); textView = (TextView)view.findViewById(R.id.tview);

    ## inflate方法的四种形式:

    inflate方法共有四种形式把xml文件的layout转化为view.

    /*  对inflate方法的说明:
    *    This class is used to instantiate layout xml files into its corresponding view object. It is never be used
     *  directly——use getLayoutInflater() or getSystemService(String)getLayoutInflate() or getSystemService(String)
     *  to retrieve a standard LayoutInflater instance that is already hooked up that is already hook up to the
     *  current context and correct configured for the device you are running on.  
    */

    1. Context.public abstract object getSystemService(String name)

    2. 两种获得LayoutInflater的方法

      a. 通过SystemService获得  

          LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLEATER_SERVICE);

      b. 从给定的context中获取  

          Public static LayoutInflater from(Context context)

      c. 二者实际上是一样的,

      源码:

    /* Obtains the LayoutInflater from the given 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; 
    }            

    3. LayoutInflater.inflate()将Layout文件转换为View,专门供Layout使用的Inflater。 虽然Layout也是View的子类,

    但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过findViewById()。

    4. LinearLayout linearLayout = (LinearLayout)findViewById(R.id.placeslist_linearlayout);  

      LinearLayout.addView(place_type_text);

    5. findViewById的两种形式   

      R.layout.xx是引用res/layout/xx.xml的布局文件(inflate 方法),  R.id.xx是引用布局文件里面的组件,组件的id是xx(findViewById方法)。  所有的组件id都能用R.id.xx来查看,但是组件不在setContentView()里面  的layout中就无法使用,Activity.findViewById()会出现空指针异常

       a. activity中的findViewById(int id)  

       b. View 中的findViewById(int id)

    6. findViewById和LayoutInflater的区别  

      不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化;

      而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。

    __________________________________________________________ shoobie do lang lang ^^
  • 相关阅读:
    Castle IOC容器内幕故事(下)
    Castle IOC容器实践之TypedFactory Facility(一)
    Castle ActiveRecord学习实践(9):使用ActiveRecord的一些技巧
    Web2.0改变了我的生活
    Castle IOC容器与Spring.NET配置之比较
    Castle IOC容器实践之Startable Facility(二)
    Castle IOC容器构建配置详解(二)
    Castle IOC容器实践之TypedFactory Facility(二)
    Castle IOC容器快速入门
    Castle IOC容器组件生命周期管理
  • 原文地址:https://www.cnblogs.com/annaivsu/p/3557765.html
Copyright © 2020-2023  润新知