簡體   English   中英

Activity和Fragment的接口自動變成null

[英]Interface between activity and fragment becomes null automatically

我有一個帶有菜單按鈕和兩個按鈕的活動。 我有三個片段 Frag_A、Frag_B 和 Frag_C。 默認情況下,我使用片段 Frag_A 加載活動。 基於單擊活動中的不同按鈕,我在片段之間切換。

對於訪問活動按鈕的片段,我創建了一個接口 BasicClickListener 並讓活動實現了該接口。

public interface BasicClickListeners {

    void onMenuClick();

    void goToFragment2();

    void goToFragment3();
} 

我在所有片段中實現了兩種方法:

public synchronized void registerBasicListener(BasicClickListeners listener) {
    basicClickListeners = listener;
}

private synchronized void unregisterBasicListener() {
    basicClickListeners = null;
}

因此,每當我通過活動啟動片段時,我都會從活動中調用 registerBasicListener() 方法。 在所有片段的 onDestroy() 上,我調用 unregisterBasicListener。

@Override
    public void onDestroy() {
        super.onDestroy();
        unregisterBasicListener();
    }

現在,如果我想 go 從片段 1 到片段 2,我使用來自片段 2 的 basiClickListeners.goToFragment2() ,它可以工作。

我不知道為什么有時我會在 basicClickListeners 上獲得 NPE。 即使片段處於活動狀態,basicClickListeners 怎么會變成 null? 而且它並不總是發生。 只有某些時候。 我無法確定它為什么發生的模式。 請幫助我解決這個問題。

您可以在Fragment中使用onAttach()onDetach()重寫方法來注冊和清除接口偵聽器。 此外,請確保該接口已在您的活動中實現。 然后,您可以使用mCallback引用來調用goToFragment2()goToFragment3()方法。

你的片段

public class YourFragment extends Fragment {
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            mCallback = (BasicClickListeners) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString()
                    + " must implement BasicClickListeners");
        }
    }
    @Override
    public void onDetach() {
        mCallback = null;
        super.onDetach();
    }
}

你的活動:

public class MainActivity extends AppCompatActivity 
implements BasicClickListeners {

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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