【问题标题】:Interface between activity and fragment becomes null automaticallyActivity 和 Fragment 之间的接口自动变为 null
【发布时间】:2020-07-31 14:07:33
【问题描述】:

我有一个带有一个菜单按钮和两个按钮的活动。我有三个片段 Frag_A、Frag_B 和 Frag_C。默认情况下,我使用片段 Frag_A 加载活动。基于点击activity中不同的按钮,我在fragment之间进行切换。

对于访问活动按钮的片段,我创建了一个接口 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();
    }

现在,如果我想从片段 1 转到片段 2,我使用来自片段 2 的 basiClickListeners.goToFragment2(),它可以工作。

我不知道为什么有时我会在 basicClickListeners 上获得 NPE。即使片段处于活动状态,basicClickListeners 怎么会变为 null?而且它并不总是发生。只有某些时候。我无法确定它发生的原因。请帮助我解决这个问题。

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

    您可以使用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 {
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      相关资源
      最近更新 更多