[英]Implementing Fragment to Activity communication without implementing interfaces directly in Activity
我有一個主要活動,負責在不同片段之間進行切換。 這些片段具有活動需要實現的接口,以便片段將數據發送回活動。
目前,我將片段中的onAttach
方法的上下文onAttach
為片段中指定的特定接口的實例。 但是,由於活動類必須實現所有這些才能使轉換正常工作,因此接口中指定的方法也需要直接在類中實現。
我想做的是創建這些接口的實例並將其保存到類變量中。 問題是如何將引用傳遞給片段? 該過程應盡可能通用,以方便添加片段。
所以不是傳統的方式
class MyActivity extends Activity implements MyFragmentListener {
public void myFragmentMethod() {
// ...
}
}
我想要的是
class MyActivity extends Activity {
private MyFragmentListener myFragmentListener = new MyFragmentListener() {
public void myFragmentMethod() {
// ...
}
};
}
問題是如何通知有關接口實現的片段。 使用BroadcastReceiver可以工作,但看起來有點混亂。
EventBus
not️嘗試一下,您很快就會上癮...它專門用於像您這樣的情況,並且超級易用。 您定義一個類,可以添加參數,方法等...,然后只需填充所需的事件(帶有類名),就可以從此處開始。 EventBus
您將在此處看到說明
在Fragment中為偵聽器提供一個setter方法。 創建Fragment之后,從Activity中調用該setter方法。
出於通訊目的,實際上只有兩種方法可以“干凈”地將片段和活動掛鈎: Fragment.onAttach()
和Activity.onAttachFragment()
。
標准模式如下(在您的片段中):
@Override
public void onAttach(Context context) {
super.onAttach(context);
callbacks = (MyInterface) context;
}
您說您不想這樣做。 有點奇怪,但是還可以。 您也許可以嘗試稍微不同的方法:
@Override
public void onAttach(Context context) {
super.onAttach(context);
MyActivity activity = (MyActivity) context;
callbacks = activity.getCallbacks();
}
這有點尷尬,因為您必須在各個片段中為每種類型的回調接口公開一個吸氣劑,但是它應該可以工作
您也可以嘗試從活動的角度進行處理:
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
if (fragment instanceof FragmentTypeOne) {
((FragmentTypeOne) fragment).setCallbacks(callbacksOne);
} else if (fragment instanceof FragmentTypeTwo) {
((FragmentTypeTwo) fragment).setCallbacks(callbacksTwo);
} // ...
}
這也有點尷尬,因為您必須反復調用instanceof
才能知道將哪個字段傳遞給片段。
不過,我希望這會有所幫助。
我剛剛想到的另一個想法是在您的活動中實現接口,然后將調用轉發給您的助手。 這可能無法滿足您的要求,因為它仍然涉及使您的活動實現所有各種接口,但是它應允許您創建單獨的類來實現實際行為,並且您的活動將如下所示:
class MyActivity extends Activity implements MyFragmentListener {
public void myFragmentMethod() {
helper.myFragmentMethod();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.