• Fragment学习(一) :生命周期


    一、 何为Fragment

    Fragment是activity的界面中的一部分或一种行为。你可以把多个Fragment们组合到一个Activity中来创建一个多面界面,并且你可以在多个Activity中重用一个Fragment。你可以把Fragment认为模块化的一段Activity,它具有自己的生命周期,接收它自己的事件,并可以在Activity运行时被添加或删除。
    Fragment不能独立存在,它必须嵌入到Activity中,而且Fragment的生命周期直接受所在的Activity的影响。例如:当Activity暂停时,它拥有的所有的Fragment们都暂停了,当Activity销毁时,它拥有的所有Fragment们都被销毁。

    然而,当Activity运行时(在onResume()之后,onPause()之前),你可以单独地操作每个Fragment,比如添加或删除它们。当你在执行上述针对Fragment的事务时,你可以将事务添加到一个棧中,这个栈被activity管理,栈中的每一条都是一个Fragment的一次事务。有了这个栈,就可以反向执行Fragment的事务,这样就可以在Fragment级支持“返回”键(向后导航)。
    当向activity中添加一个Fragment时,它须置于ViewGroup控件中,并且需定义Fragment自己的界面。你可以在layoutxml文件中声明Fragment,元素为:<fragment>;也可以在代码中创建Fragment,然后把它加入到ViewGroup控件中。然而,Fragment不一定非要放在Activity的界面中,它可以隐藏在后台为Activity工作。

    说道这里,你可能还无法理解,那我们举个官网上的例子说明下:

    写一个读新闻的程序,可以用一个Fragment显示标题列表,另一个Fragment显示选中标题的内容,这两个Fragment都在一个Activity上,并排显示。那么这两个Fragment都有自己的生命周期并响应自己感兴趣的事件

    于是,不需再像手机上那样用一个Activity显示标题列表,用另一个Activity显示新闻内容;现在可以把两者放在一个Activity上同时显示出来。


    二、 Fragment的生命周期



    接下来,我们通过一个实例来更好的理解Fragment。

    定义一个Fragment,并覆盖其中的11个回调方法:

    import android.app.Activity;
    import android.app.Fragment;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    public class LifecycleFragment extends Fragment
    {
        final String TAG = "LifecycleFragment";
    
        @Override
        public void onAttach(Activity activity)
        {
            super.onAttach(activity);
            // 输出日志
            Log.d(TAG, "-------onAttach------");
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            // 输出日志
            Log.d(TAG, "-------onCreate------");
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle data)
        {
            // 输出日志
            Log.d(TAG, "-------onCreateView------");
            TextView tv = new TextView(getActivity());
            tv.setGravity(Gravity.CENTER_HORIZONTAL);
            tv.setText("测试Fragment");
            tv.setTextSize(40);
            return tv;
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState)
        {
            super.onActivityCreated(savedInstanceState);
            // 输出日志
            Log.d(TAG, "-------onActivityCreated------");
        }
    
        @Override
        public void onStart()
        {
            super.onStart();
            // 输出日志
            Log.d(TAG, "-------onStart------");
        }
    
        @Override
        public void onResume()
        {
            super.onResume();
            // 输出日志
            Log.d(TAG, "-------onResume------");
        }
    
        @Override
        public void onPause()
        {
            super.onPause();
            // 输出日志
            Log.d(TAG, "-------onPause------");
        }
    
        @Override
        public void onStop()
        {
            super.onStop();
            // 输出日志
            Log.d(TAG, "-------onStop------");
        }
    
        @Override
        public void onDestroyView()
        {
            super.onDestroyView();
            // 输出日志
            Log.d(TAG, "-------onDestroyView------");
        }
    
        @Override
        public void onDestroy()
        {
            super.onDestroy();
            // 输出日志
            Log.d(TAG, "-------onDestroy------");
        }
    
        @Override
        public void onDetach()
        {
            super.onDetach();
            // 输出日志
            Log.d(TAG, "-------onDetach------");
        }
    }
    

    包含该Fragment的Activity(Fragment是activity的界面中的一部分,它必须依附于Activity存在)的定义如下:

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class FragmentLifecycle extends Activity
    {
        Button startActivity, addFragment, backFragment, replaceFragment, finish;
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            startActivity = (Button) findViewById(R.id.startActivity);
            addFragment = (Button) findViewById(R.id.addFragment);
            backFragment = (Button) findViewById(R.id.backFragment);
            replaceFragment = (Button) findViewById(R.id.replaceFragment);
            finish = (Button) findViewById(R.id.finish);
            // 为startActivity按钮绑定事件监听器
            startActivity.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View source)
                {
                    Intent intent = new Intent(FragmentLifecycle.this, SecondActivity.class);
                    startActivity(intent);
                }
            });
            // 为addFragment按钮绑定事件监听器
            addFragment.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View source)
                {
                    LifecycleFragment fragment = new LifecycleFragment();
                    getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
                }
            });
            // 为backFragment按钮绑定事件监听器
            backFragment.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View source)
                {
                    SecondFragment fragment = new SecondFragment();
                    getFragmentManager().beginTransaction().replace(R.id.container, fragment).addToBackStack("aa")// 将替换前的Fragment添加到Back栈
                    .commit();
                }
            });
            // 为replaceFragment按钮绑定事件监听器
            replaceFragment.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    SecondFragment fragment = new SecondFragment();
                    getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
                }
            });
            // 为finish按钮绑定事件监听器
            finish.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View source)
                {
                    // 结束该Activity
                    FragmentLifecycle.this.finish();
                }
            });
        }
    }



    下面,我们测试Fragment的生命周期:

    1. 点击“加载目标Fragment”,查看日志输出


    可以看到,Fragment加载后,经过onResume方法后,变为运行可见的状态。

    2. 单击“启动对话框风格的Activity”。


    启动对话框风格的Activity时,原先的Activity进入onPause()状态,而它管理的Fragment同样进入OnPause状态。


    3. 关闭对话框风格的Activity


    可见,当对话框关闭后,Fragment又变为运行状态。


    4. 单击“替换目标Fragment、并加入Back栈”


    替换目标Fragment、并加入Back栈中,此时该Fragment虽然不可见,但它并未被销毁。当用户按下返回键,该Fragment将再次显示出来。


    5. 单击退出按钮,结束Fragment


    退出Activity后,Fragment同样被销毁。

  • 相关阅读:
    webstorm实现手机预览页面
    git 远端版本回退
    Vue开发中的移动端适配(px转换成vw)
    测试web-view,实现小程序和网页之间的切换
    mysql 字符集研究
    Openssl
    Android Activity 去掉标题栏及全屏显示
    Android中的 style 和 theme
    Android sharedPreferences 用法
    Vim 字符集问题
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330023.html
Copyright © 2020-2023  润新知