(转) onCreate()和onCreateView()浅谈

onInflate()和onAttach()

Fragment可有一个view hierarchy,以之与用户互动。这个view层级能够根据XML布局文件被建立(inflated)或经过代码建立。view层级须要与activity关联,才能被用户看见。Fragment的最初的两个生命周期为onInflate和onAttach。android

/* 左边fragment是list,和ListActivity同样,继承ListFragment */
public class TitleFragment extends ListFragment{
    private FragmentBasicTest myActivity = null; 
    private int mCurCheckPosition = 0;  
     
    …... 略 …… 

    @Override //【2】在fragment与activity关联后调用onAttach()。因为右边fragment的具体实如今activity的showDetails()中实现,须要获取activity的对象。 固然也能够直接用getActivity()获取。
    public void onAttach(Activity activity) {  
        showInfo("onAttach() is called. activity is " + activity); 
        showInfo("   getActivity() : " + getActivity());

        super.onAttach(activity);
        myActivity = (FragmentBasicTest)activity; 
    }     

    @Override//【1】首先调用:在Activity调用setContentView()时,xml中有<fragment>时被调用。bundle存贮的是fragment的状态,并不是初始化的值。通常而言,此时太早,尚未和activity关联,通常不多须要在此进行处理,除非咱们须要处理fragment的属性或参数。在API的reference中,Fragment的主要lifecycle甚至没有将onInflate()列入,所以在实际编程中,会较少用到。
    public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { 
        showInfo("onInfalte() is called");
        showInfo("   activity : " + activity);
        showInfo("   getActivity() : " + getActivity()); //Fragment尚为关联activity
        showInfo("   attribute是fragment的属相,例如R.id.titles =  " + R.id.titles); 
        for(int i = 0 ; i< attrs.getAttributeCount() ; i ++){ 
            showInfo("    attribute " + i + " :" + attrs.getAttributeName(i) + " = " + attrs.getAttributeValue(i));
        } 
        showInfo("   bundle : " + savedInstanceState);
       super.onInflate(activity, attrs, savedInstanceState);
    } 

    private void showInfo(String s){ 
        Log.d("TitleFragment",s); 
    }     
}编程

咱们看看运行的logcat显示。咱们能够看出,在activity调用setContentView时,先调用Flagment中的onflate(),而后调用onAttach()。在onInfalte()中能够读取到咱们在xml文件中<fragment… >设置的属性。在后面实现右边的fragment中,因为布局文件中<fragment …>中并无指定class属性,而是在代码中实现,故没有onInflate()状态。ide

与activity的关联:看到onInfalte()和onAttach()均可以得到activity对象,可是若是采用getActivity()来获取,则发现onInfalte()的阶段对处理UI太早,都不能关联到activity。函数

参数:在整个生命周期,能够经过getArguments()来获取参数,可是不能在与activity关联后进行setArgments(),只能在初始化极早的阶段,例如构造函数和onInflate()。布局

onCreate()和onCreateView()

@Override //【3】在建立fragment中进行初始化时调用。注意此处的bundle参数,是存储fragment的状态。若是咱们要为fragment启动一个后台线程,能够考虑将代码放于此处。 
public void onCreate(Bundle savedInstanceState) {  
   showInfo("onCreate() is called. ");
    super.onCreate(savedInstanceState);


@Override //【4】建立fragment,并返回fragment的view层次结构,用于对UI的设计。本例继承了ListFragment实现,由其生成ListView,它的资源ID是android.R.id.list1,或者能够经过getListView()来获取。咱们在此不须要在进行特别的处理,仅用于跟踪生命周期。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    showInfo("onCreateView() is called. ");
    return super.onCreateView(inflater, container, savedInstanceState);
学习

onCreate()和onCreateView()都是在activity调用setContentView()时被调用。也就是activity上未完成onCreate(),所以不该该在此加入与activity的view相关的代码。然后面的生命周期这是在activity完成onCreate()以后调用的。.net

onActivityCreated()

onActivityCreated顾名思义,是在activity完成onCreate()后被调用。咱们能够在此处理activity的其余UI操做,而其余的fragment已经与activity关联,咱们能够进行相互间处理。这也是用户看到UI界面以前的最后一个状态,对于从saved状态中从新建立activity及fragment来说是重要状态。线程

回想一下,在ListActivity中是在setContentView()后面进行Adapter的设置,由于setContentView已经提供了view层级,所以在fragment中具体设置list也放在fragment的onCreateView()以后的生命周期onActivityCreated()中执行。设计

   @Override //【5】onActivityCreated()在activity完成onCreate()后执行,在此能够加入UI设计(onCreateView())以后,UI被用户看到以前的代码。 
    public void onActivityCreated(Bundle savedInstanceState) {  
        showInfo("onActivityCreated() is called.");
        super.onActivityCreated(savedInstanceState); 
       // 1)经过Adapter进行view和data的关联   
        setListAdapter
(new ArrayAdapter<String>(getActivity(),   //注意:在ListFragment中要直接和ListView(经过id或者getListView()获取)关联,而要用setListAdapter()
                android.R.layout.simple_list_item_1, 
                BooksInfo.TITLES)); 
        ListView lv = getListView(); 
        lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
        lv.setSelection(mCurCheckPosition); 
        //2)根据书名设置右边framgent UI。 
        myActivity.showDetails(mCurCheckPosition); 
    }3d

onStart()、onResume()、onPause()和onStop()

这几个状态和activty的相应状体类似,对应为可视,可互动,不可互动和不可视。和activity的生命周期图相对比,从不可视的后台回复到可视的前台的过程是onStop()—>onRestart()—>onStart()。而fragment为onStop()—>onStart()。

onDestroyView()、onDestroy和onDetach()

当fragment容许与view相关的资源释放时调用onDestroyView(),清空经过onCreateView()所返回的view。接着,onDestroy()进行最后fragment状态的清空。最后调用onDetach(),删除与activity的关联()。

与用户互动处理

@Override //当用户点击书名,在右边fragment中显示相关的内容。在ListFragment中能够直接经过回调函数onListItemClick来实现。
public void onListItemClick(ListView l, View v, int position, long id) { 
    mCurCheckPosition = position; 
    myActivity.showDetails(mCurCheckPosition); 

本博文涉及的例子代码,能够在Pro Android学习:Fragment中下载。

相关文章
相关标签/搜索