英文:
Interface between activity and fragment becomes null automatically
问题
我有一个包含菜单按钮和两个按钮的活动。我有三个片段Frag_A、Frag_B和Frag_C。默认情况下,我加载活动时使用片段Frag_A。根据在活动中单击不同的按钮,我在这些片段之间切换。
为了让片段访问活动按钮,我创建了一个接口BasicClickListeners,并使活动实现了这个接口。
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呢?而且这并不总是发生,只是偶尔发生。我无法确定出现这个问题的模式。请帮助我解决这个问题。
英文:
I have an activity with a menu button and two buttons. I have three fragments Frag_A, Frag_B, and Frag_C. By default, I am loading the activity with the fragment Frag_A. Based on clicking different buttons in the activity, I switch between the fragments.
For the fragment to access the activity buttons, I have created an interface BasicClickListener and I have made the activity implement the interface.
public interface BasicClickListeners {
void onMenuClick();
void goToFragment2();
void goToFragment3();
}
I have implemented two methods in all fragments:
public synchronized void registerBasicListener(BasicClickListeners listener) {
basicClickListeners = listener;
}
private synchronized void unregisterBasicListener() {
basicClickListeners = null;
}
So, whenever I launch a fragment through the activity, I call registerBasicListener() method from the activity. And on all fragments' onDestroy(), I am calling unregisterBasicListener.
@Override
public void onDestroy() {
super.onDestroy();
unregisterBasicListener();
}
Now if I wanted to go to fragment 2 from fragment 1, I use basiClickListeners.goToFragment2() from fragment 2, and it works.
I don't know why sometimes I am getting NPE on basicClickListeners. Even though the fragment is active, how can the basicClickListeners become null? And it's not happening always. Only sometimes. I couldn't identify a pattern on why it's occurring. Kindly assist me with this issue.
答案1
得分: 1
你可以在Fragment
中使用onAttach()
和onDetach()
重写方法来注册和清除接口监听器。同时,确保该接口在你的活动中被实现。然后,你可以使用mCallback
引用来调用goToFragment2()
和goToFragment3()
方法。
YourFragment
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();
}
}
YourActivity:
public class MainActivity extends AppCompatActivity
implements BasicClickListeners {
}
英文:
You can use onAttach()
and onDetach()
overridden method in Fragment
for registering and clearing the interface listeners. Also, make sure that the interface is implemented in your activity. Then, you can use mCallback
reference for calling the goToFragment2()
, goToFragment3()
methods.
YourFragment
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();
}
}
YourActivity:
public class MainActivity extends AppCompatActivity
implements BasicClickListeners {
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论