1. 程式人生 > >在fragment中用頻道管理遇到的問題(解決)

在fragment中用頻道管理遇到的問題(解決)

ps:和在Activity中做大體是一樣的,如果想了解具體內容,請觀看上一篇文章:https://blog.csdn.net/weixin_43807869/article/details/85062439

在fragment做頻道管理遇到的問題:
在這裡插入圖片描述
大家仔細觀察就可以發現,不論怎麼去掉頻道,返回後頻道還在

可以判斷是onActivityResult方法沒有接收到回傳值

對比一下,Activity做法與Fragment做法不同之處

Fragment:

//進入頻道管理
 ChannelActivity.startChannelActivity((AppCompatActivity) getActivity(),tele_list);

Activity:

//啟動管理,跳轉(進入頻道管理),將頻道集合傳過去
  ChannelActivity.startChannelActivity(MainActivity.this,titlelist);

引數一個是getActivity(),一個是MainActivity.this
getActivity():fragment沒有上下文,它只能求助於它繫結的Activity
所以說修改頻道後返回,值沒有回傳到Fragment中的onActivityResult而是回傳到了它繫結的activity中

解決辦法:
在fragment繫結的Activity中,重寫onActivityResult方法,將data傳遞給fragment中的onActivityResult方法:

//接受到新頻道的值
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
         //根據tag找到fragment
        Fragment ff = getSupportFragmentManager().findFragmentByTag("ff");
        //將得到的新頻道傳遞給fragment01的onActivityResult
        ff.onActivityResult(requestCode, resultCode, data);

    }

結果圖:
在這裡插入圖片描述

最後:我還遇見一種錯誤,操作頻道後,切換下方的fragment(點選訊息2/3),再次返回訊息1發現又回到最初的頻道:

原因是:切換fragment,我用的替換事務的方法,每次切換都會new新的fragment**

**這樣:**

 //獲取事務管理
        manager = getSupportFragmentManager();
        //開啟事務
        FragmentTransaction fragmentTransaction = manager.beginTransaction();
        //新增事務
        fragmentTransaction.add(R.id.frameLt,new Fragment01());
        //提交事務
        fragmentTransaction.commit();

        //第一個Radiobutton預設選中
        radioGroup.check(radioGroup.getChildAt(0).getId());

        //radioGroup的監聽
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                //開啟新事務,上一個已經提交
                FragmentTransaction fragmentTransaction2 = manager.beginTransaction();

                switch (i){
                    case R.id.btn01:
                        //替換fragment
                        fragmentTransaction2.replace(R.id.frameLt,new Fragment01());
                        break;
                    case R.id.btn02:
                        fragmentTransaction2.replace(R.id.frameLt,new Fragment02());
                        break;
                    case R.id.btn03:
                        fragmentTransaction2.replace(R.id.frameLt,new Fragment03());
                        break;

                }
                fragmentTransaction2.commit();
            }
        });

ps:可能只有我會遇到這種錯吧! 希望對大家有幫助~~