初學者,碰到無法解釋的難題,希望求助大神幫忙!謝謝!
問題描述:
一個activity(宿主),三個fragment(A,A1,A2),關系是:A是子fragment嵌套在宿主activity里,A又包含兩個子fragment,這兩個子fragment嵌套在A中(不使用viewpager)。在A里,使用getChildFragmentManager()方法加載A1和A2,并且使用show/hide方式對A1、A2進行切換。代碼如下:
if (targetFragment != null) {
//打開相應的fragment
FragmentManager fragmentManager = getChildFragmentManager();//創建FragmentManager物件 FragmentTransaction transaction = fragmentManager.beginTransaction();//創建FragmentTransaction物件
if (!targetFragment.isAdded()) {//如果要顯示的targetFragment沒有添加過
transaction
.hide(mCurFragment)//隱藏當前Fragment
.add(R.id.sshpfrag, targetFragment, targetFragment.getClass().getName())//添加targetFragment
.commit();
} else {//如果要顯示的targetFragment已經添加過
transaction//隱藏當前Fragment
.hide(mCurFragment)
.show(targetFragment)//顯示targetFragment
.commit();
}
//更新當前Fragment為targetFragment
mCurFragment = targetFragment;
}
//*************************************************************************************************************************************
現在,我在A的 onActivityCreated(Bundle savedInstanceState)中設定了一個計時器,代碼如下:
timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Message msg = new Message();
msg.arg1 = 3;
handler.sendMessage(msg);//sendMessage()方法用于將訊息壓入Message堆疊中。
}
},0,1000);
然后,又在A中設定了一個介面以便回呼,代碼如下:
public interface Apagecallback {
void interval(int flag);
}
最后,在A1和A2中分別實作interval介面,就是監聽計時器。
代碼如下:
A1的介面實作
@Override
public void interval(int flag) {//定時器狀態
Log.d("A1flag*************", String.valueOf(flag));
}
A2的介面實作
@Override
public void interval(int flag) {//定時器狀態
Log.d("A2flag*************", String.valueOf(flag));
}
//*************************************************************************************************************************************
就是兩個子fragment共同實作了父fragment的介面
//*************************************************************************************************************************************
運行起來沒報錯,但問題出現了!!!
開始時,A打開A1,這時可以看到 Log.d("A1flag*************", String.valueOf(flag));每隔一秒列印出一個log,然后,我又點擊按鈕打開了A2(A1被隱藏起來,A2show,A1hidde)這時可以看到 Log.d("A2flag*************", String.valueOf(flag));可A1的監聽呢????即便我再次打開A1(A1show,A2hide)看到的還是"A2flag*************"A1是被隱藏起來而不是銷毀,為何A1介面回呼不到了???,我也log.d列印過A、A1、A2的生命周期,只有加載的時候有生命周期,show/hide不走任何生命周期,那為何A1再也回呼不到?我希望A1、A2能同時監聽到回呼,該如何做?希望大神幫忙!謝謝了!
uj5u.com熱心網友回復:
問題補充:我是一個初學者,還有許多問題沒搞明白,也可能這個問題根本不是個問題,當然我也想到其他的解決辦法,但這口氣兒順不過來!明明是隱藏,沒有銷毀,但為何只能列印出A2?如果說只要子fragment隱藏就無法再回呼,可又解釋不通,因為從A2切換回A1(此時A2hide)也是能列印出log的。再換句話說,如果fragment隱藏狀態下什么都干不了,那何必用show/hide方式切換?倒不如replace來得痛快!另外,如果連回呼都無法實作,那使用本地廣播也當然接收不到了?
uj5u.com熱心網友回復:
你的回呼監聽是一個Apagecallback變數還是List<Apagecallback>,如果只是單個變數,當你把A2設定為監聽時,A1就被替換掉了。如果你要都回應監聽,需要自己用List<Apagecallback>把兩個都保存uj5u.com熱心網友回復:
樓上兄弟提示得很對!多謝!多謝!怎奈我水平有限,搞了一天頭暈腦脹!到底也沒搞出來!實在凄涼!兄弟能否受累賞下個例子?感激不盡!uj5u.com熱心網友回復:
在你的FragmentA中,將 Apagecallback 監聽改為 Set<Apagecallback>,然后把setCallback方法修改為addCallback,代碼是將新增callback添加到Set合集,在回呼的地方遍歷Set去呼叫Callback方法FragmentA大致代碼如下
Set<Apagecallback> callbackSet = new HashSet<>();
public void addCallback(Apagecallback callback){
callbackSet.add(callback);
}
// 假設該方法是你回呼的方法
public void call(int flag){
// 遍歷set
for(Apagecallback callback: callbackSet){
callback.interval(flag);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/83206.html
標籤:Android
上一篇:想從零自學做這小程式,求指導
下一篇:Android 代碼切換網路型別
