Fragment的生命週期

MoneyCitys 2015-11-10 02:22:55
Fragment的生命週期大致上了解

因為需要在fragment 離開或銷毀時做判斷
所以就在fragment裡改寫了onDestroyView

於是發現了一件很奇怪的事
那就是fragment從來沒呼叫過 onPause
之後的onStop onDestroy 之類的就更別說了
甚至將app關掉了他也沒呼叫過
這真的很神奇

但神奇歸神奇, 這個就困擾我了
我需要知道fragment什麼時候被銷毀
目前所有的fragment做切換都是在同一個container,使用replace

請問是不是有什麼原因
...全文
113 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
MoneyCitys 2015-11-10
  • 打赏
  • 举报
回复
引用 5 楼 jklwan 的回复:
你每次replace时都是使用的new Fragment(),而且没有判断显示的是否是当前的Fragment,这样你用生命周期做各种处理都没有意义。你应该为每个Fragment定义变量,如NewsFragment newsFragment,用int type(或其他类型变量)来保存当前显示的fragment的位置... [/code]
有的, 為Fragment加上Tag保存狀態也試過了 但仍然出現這種問題
jklwan 2015-11-10
  • 打赏
  • 举报
回复
你每次replace时都是使用的new Fragment(),而且没有判断显示的是否是当前的Fragment,这样你用生命周期做各种处理都没有意义。你应该为每个Fragment定义变量,如NewsFragment newsFragment,用int type(或其他类型变量)来保存当前显示的fragment的位置。然后在点击事件中处理,如下关键代码:

NewsFragment newsFragment;
int type =1;
...
           switch (view.getId()) {
                case R.id.news :
                    if(type != 1){
                           type = 1;
                          if(newsFragment==null){
                                    newsFragment = new NewsFragment();
                          }
                          ft.replace(R.id.contentFragment,fragment);
                     }
                    break;
         }
       ft.commit();
MoneyCitys 2015-11-10
  • 打赏
  • 举报
回复
不, 我發現我錯了, code也不執行... 上面沒有權限編輯,我貼在這裡 基本上把NewsFragment  的onPause改成以下這樣 其中adapter是我自己額外寫的一個class

@Override
    public void onPause() {
        super.onPause();
        Log.d("release","確認小圖資源");
        if (adapter != null) {
            Log.d("release", "開始釋放小圖資源");
            for (int i = 0; i < adapter.bmpList.size(); i++) {
                if (adapter.bmpList.get(i).isRecycled()) {
                    Log.d("release", "釋放圖資源" + i);
                    adapter.bmpList.get(i).recycle();
                }
            }
        }
    }
MoneyCitys 2015-11-10
  • 打赏
  • 举报
回复
不好意思, 因為全部的code太長, 所以就東刪西刪把關鍵的部份貼上 fragment的部分就貼一個就好, 大概就長那樣 目前問題算解決了一半 因為我發現其實還是有調用的 但奇怪的是Log並沒有顯示 可是其他的code有執行, 例如以下我放在Fragment底下onPause的test++ 雖然還是有小問題, 但已經不影響使用 感謝各位

public class InfoActivity extends FragmentActivity {

    LinearLayout newsText,classesText,photoText,loginText,qrCode,about;
    public static int test = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_info);
        settings();
    }

    void settings() {
        fm = getFragmentManager();

        qrCode = (LinearLayout)findViewById(R.id.qrCode);
        newsText = (LinearLayout)findViewById(R.id.news);
        classesText = (LinearLayout)findViewById(R.id.classes);
        photoText = (LinearLayout)findViewById(R.id.photo);
        loginText = (LinearLayout)findViewById(R.id.login);
        about = (LinearLayout)findViewById(R.id.about);
       

        about.setOnClickListener(textListener);
        qrCode.setOnClickListener(textListener);
        newsText.setOnClickListener(textListener);
        classesText.setOnClickListener(textListener);
        photoText.setOnClickListener(textListener);
        loginText.setOnClickListener(textListener);


    }

    View.OnClickListener textListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            System.out.println("test = " + test);

            switch (view.getId()) {
                case R.id.news :
                    fragment = new NewsFragment();
                    ft.replace(R.id.contentFragment,fragment);
                    break;
                case R.id.classes :
                    fragment = new ClassesFragment();
                    ft.replace(R.id.contentFragment,fragment);
                    break;
                case R.id.photo :
                    PhotoContentAdapter.bigger = 0;
                    fragment = new PhotoFragment();
                    ft.replace(R.id.contentFragment,fragment);
                    break;
                case R.id.login :
                    drawerLayout.openDrawer(GravityCompat.END);
                    break;

                case R.id.qrCode :
                    Intent it = new Intent(InfoActivity.this,QRActivity.class);
                    startActivity(it);
                    break;

                case R.id.about :
                    fragment = new QAFragment();
                    ft.replace(R.id.contentFragment, fragment);
                    break;
            }
            ft.commit();

        }
    };
}
以下是fragment

public class NewsFragment extends Fragment {

    TextView aaaa;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.media_controller,container,false);
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        aaaa = (TextView)getView().findViewById(R.id.aaaa);
        aaaa.setText("aaaaaaaaaaaaaa");
    }


    @Override
    public void onPause() {
        super.onPause();
        InfoActivity.text++;
        Log.d("頁面","onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d("頁面", "onStop");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("頁面", "onDestroy");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d("頁面", "onDetach");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("頁面", "onDestroyView");
    }
}

jklwan 2015-11-10
  • 打赏
  • 举报
回复

如图,使用replace,Fragment的生命周期是正常的。

FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.container,fragment);
ft.commit();
scnuxisan225 2015-11-10
  • 打赏
  • 举报
回复
请贴代码看看

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧