Android RadioGroup.check() onCheckedChanged 調(diào)用3次 FragmentTransaction.commit() 不會(huì)立即起作用

昨天遇到了個(gè)Android問(wèn)題,java.lang.IllegalStateException: Fragment already added. backtrace里邊沒(méi)有自己的代碼.(好像是fragment重復(fù)添加)

問(wèn)題情境大概,主界面 四個(gè)Tab, FragmentTransaction.add() show() commit() 在 onCheckedChangeListener中,來(lái)切換四個(gè)fragment,有個(gè)需要需要在代碼中點(diǎn)擊radiobutton的地方(programmatically),結(jié)果出問(wèn)題了,每當(dāng)點(diǎn)擊一個(gè)radiobutton處理邏輯大概這樣,判端這個(gè)指定的FragmentManager.getFragmentByTag(),if null,就 FragmentTransaction.add(fragment...);

上代碼片段

setOnCheckedChangeListener

radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
//                if(checkedId == radioGroup.getCheckedRadioButtonId()){
//                    return;
//                }
                ZLog.d("MainPage setOnCheckedChangeListener now checked " + checkedId + "  last checked " + lastCheckId);
                fragmentTransaction = fragmentManager.beginTransaction();
                switch (checkedId) {
                    case R.id.one:
                        hideOtherFragment("one");
                        addOrShowFragment("one", firstFragment);
                        break;
                    case R.id.two:
                        hideOtherFragment("two");
                        addOrShowFragment("two", secondFragment);
                        break;
                    case R.id.three:
                        hideOtherFragment("three");
                        addOrShowFragment("three", thirdFragment);
                        break;
                    case R.id.four:
                        hideOtherFragment("four");
                        addOrShowFragment("four", fourthFragment);
                        break;
                    case R.id.radio_user:
                        hideOtherFragment("user");
                        addOrShowFragment("user", userFragment);
                        break;
                }
                ZLog.d("radioGroup onCheckedChange");
                fragmentTransaction.commit();
                fragmentManager.executePendingTransactions(); //重點(diǎn)
                currFragment.scrollTop();//在commit前滾動(dòng)到頂部
                markChecked(checkedId);
            }
        });

radioGroup.check()

touristSubscription1 = RxBroadcast.fromLocalBroadcast(this, touristnotaccess)
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext(new Action1<Intent>() {
                    @Override
                    public void call(Intent intent) {
//                        radioGroup.check(R.id.radio_user);//重點(diǎn)
                          RadioButton b = (RadioButton) findViewById(R.id.radio_user);
                          b.setChecked(true);
                    }
                })
                .doOnError(new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        throwable.printStackTrace();
                    }
                })
                .subscribe(new Action1<Intent>() {
                    @Override
                    public void call(Intent intent) {

                    }
                });

fragmentTransaction

private void addOrShowFragment(String tag, BaseFragment fragment) {
        ZLog.d("addOrShowFragment " + fragmentManager.getFragments() + "  tag " + tag + "  isAdd " + fragment.isAdded());
        if (fragmentManager.findFragmentByTag(tag) == null) {
            fragmentTransaction.add(R.id.fragments_content, fragment, tag);
        } else if (!fragment.isAdded()) {
            fragmentTransaction.replace(R.id.fragments_content, fragment, tag);
        } else {
            fragmentTransaction.show(fragment);
        }
        currFragment = fragment;
    }

RadioGroup.check(layoutid) onCheckedChangeListener#onCheckChanged()調(diào)用了 3 次(1 原來(lái)的radiobutton,2將要的radiobutton, 3將要的radiobutton)
確實(shí)調(diào)用了三次,stackoverflow上老外看了源碼了,調(diào)用了三次。問(wèn)題在于,第三次調(diào)用的時(shí)候,判斷 將要顯示的fragment是否存在于FragmentManager.getFragments()中,明擺著第二次已經(jīng)add了,已經(jīng)commit了,F(xiàn)ragmentManager.getFragments()還沒(méi)有,原來(lái)commit()不會(huì)立即產(chǎn)生效果。解決方式,radiobutton.setChecked(true)替代。

FragmentTransaction.commit()不會(huì)立即產(chǎn)生效果。解決方式,F(xiàn)ragmentManager.executePendingTransactions(); 立即產(chǎn)生效果

兩種解決方式任選其一即可,都選也沒(méi)事。

Reference (stackoverflow)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容