簡體   English   中英

實現片段到活動的通信,而無需直接在活動中實現接口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM