2014年8月15日 星期五

[Android]android Fragment 生命週期(life Cycle)

當如果在Activity要使用Fragment的話,就會遇到生命週期的問題
Activity有自己的生命週期,Fragment也有擁有自己的生命週期
所以Fragment就會受到Activity生命週期的限制
來看看,以下是Activity和Fragment對照圖
0_1326006184miBx.gif



做個實驗驗證一下上圖
拿之前做的Actionbar Tab來弄


MainActivity.java
public class MainActivity extends Activity {
     static String Tag = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
           Log.i(Tag, "onCreate()............");
        
      ActionBar actionBar = getActionBar();
        // 設置AcitonBar的操作模型

        ActionBar.Tab tab1 = actionBar.newTab().setText("Normal");
        ActionBar.Tab tab2 = actionBar.newTab().setText("Project");
        
        
        Fragment Fragment1Name = new Calculator1Fragment() ;
        Fragment Fragment2Name = new EditFragment();
    
        tab1.setTabListener(new MyTabListener(Fragment1Name));
        tab2.setTabListener(new MyTabListener(Fragment2Name));
        
        
        actionBar.addTab(tab1);
        actionBar.addTab(tab2);
        

    }

     class MyTabListener implements ActionBar.TabListener
        {
            //接收每個tab得fragment

            private Fragment fragment;
          

            public MyTabListener(Fragment fragment)
            {
                this.fragment = fragment;
            }

            public void onTabReselected(Tab tab, FragmentTransaction ft)
            {

            }
            @Override
            public void onTabSelected(Tab tab, FragmentTransaction ft) {
                // TODO Auto-generated method stub

                ft.replace(R.id.context, fragment);
                
            }

            @Override
            public void onTabUnselected(Tab tab, FragmentTransaction ft) {
                // TODO Auto-generated method stub

                ft.remove(fragment);
                
            }
        }
     
     @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.i(Tag, "onDestory()............");
        }

        @Override
        protected void onPause() {
            super.onPause();
            Log.i(Tag, "onPause()............");
        }

        @Override
        protected void onResume() {
            super.onResume();
            Log.i(Tag, "onResume()............");
        }

        @Override
        protected void onStart() {
            super.onStart();
            Log.i(Tag, "onStart()............");
        }

        @Override
        protected void onStop() {
            super.onStop();
            Log.i(Tag, "onStop()............");
        }
     
}


Fragment裡


Framgment.java
package com.example.actionbar1;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Calculator1Fragment extends Fragment {
    
     static String Tag = "Fragment1";
     public void onCreate(Bundle savedInstanceState) 
            Log.i(Tag, "onCreate()............");
            super.onCreate(savedInstanceState);
            
        }
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {        
          Log.i(Tag, "onCreateView()............");
        return inflater.inflate(R.layout.main_calcurator, container, false);
      
    }
    
    public void onActivityCreated (Bundle savedInstanceState){
        Log.i(Tag, "onActivityCreate()............");
         super.onActivityCreated(savedInstanceState);
    }
     @Override
        public void onDestroyView() {
            super.onDestroyView();
            Log.i(Tag, "onDestroyView()............");
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.i(Tag, "onDestroy()............");
        }

        @Override
        public void onDetach() {
            super.onDetach();
            Log.i(Tag, "onDetach()............");
        }

        @Override
        public void onPause() {
            super.onPause();
            Log.i(Tag, "onPause()............");
        }

        @Override
        public void onResume() {
            super.onResume();
            Log.i(Tag, "onResume()............");
        }

        @Override
        public void onStart() {
            super.onStart();
            Log.i(Tag, "onStart()............");
        }

        @Override
        public void onStop() {
            super.onStop();
            Log.i(Tag, "onStop()............");
        }


        @Override
        public void onAttach(Activity activity) {
            Log.i(Tag, "onAttach()............");
            super.onAttach(activity);
        }
}


接著打開LogCat來看看life Cycle
  • 當我run這個app的時候,life Cycle為sss.png
在fragment onResume之後開始執行Fragment內容
  • 接著離開程式
    s.png
    程式end
  • 執行中按下Home,在叫回來
    ssss.png
    當按下home鍵時,程式只是onstop(),並不會銷毀
    接著再把他叫回來繼續執行Fragment

沒有留言:

張貼留言