假设有这样一个场景,我们有一个活动和3个片段,如:MyActivity
Frg1
,Frg2
和Frg3
。 Frg2
和Frg3
已嵌入到viewPager中。我的需求是从Frg2
触发Frg1
。我创建了一个界面TriggerActivityFromFrg1
,MyActivity
实现了它,当我在Frg1
中按下按钮时,我调用(getActivity) triggerActivityFromFrg1.trigger()
并在trigger()
中调用方法MyActivity
,问题是如何从活动中触发Frg2
?
我想以某种方式建立MyActivity和Frg2之间的接口。
P.S。我不想使用eventbus。
答案 0 :(得分:1)
让您的Frg2
班级也实施该界面:
public class Frg2 extends Fragment implements TriggerActivityFromFrg1 {
并实施方法
@Override
public void trigger() {
if (getView() != null) { // see comments below
// TODO logic here
}
}
在活动中添加一个字段以跟踪目标片段:
private TriggerActivityFromFrg1 mTarget;
将注册/取消注册方法添加到活动:
public synchronized void registerTriggerTarget(TriggerActivityFromFrg1 listener) {
mTarget = listener;
}
public synchronized void unregisterTriggerTarget(TriggerActivityFromFrg1 listener) {
if (mTarget == listener) {
mTarget = null;
}
}
在您的活动中制作触发器方法,如下所示:
public void trigger() {
if (mTarget != null) {
mTarget.trigger();
}
}
覆盖onAttach()
中的onDetach()
和Frg2
以注册/取消注册:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MyActivity) activity).registerTriggerTarget(this);
}
@Override
public void onDetach() {
((MyActivity) getActivity()).unregisterTriggerTarget(this);
super.onDetach();
}
恭喜,您刚刚建立了自己的迷你活动巴士。
你必须添加所有这些代码是有原因的,因为ViewPager
在需要之前不会创建片段。它还将MyActivity
与Frg2
分开。
如果扩展FragmentPagerAdapter
,要记住的另一件事是,即使视图被破坏,片段也会保留在内存中,因此请确保检查片段是否具有有效视图,即if (getView() != null)