繁体   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