Android 安卓奥托巴士公司没有';t将事件从片段的onActivityResult()方法激发到活动

Android 安卓奥托巴士公司没有';t将事件从片段的onActivityResult()方法激发到活动,android,android-fragments,onactivityresult,otto,Android,Android Fragments,Onactivityresult,Otto,我有带有register()和unregister()方法的BaseActivity: 我有一个孩子的活动,它的火不会对碎片造成伤害,而且效果很好 public class ChildActivity extends BaseActivity implements View.OnClickListener{ private ImageView btnDone; @Override public void onCreate(Bundle savedInstanceSta

我有带有register()和unregister()方法的BaseActivity:

我有一个孩子的活动,它的火不会对碎片造成伤害,而且效果很好

public class ChildActivity extends BaseActivity implements View.OnClickListener{

    private ImageView btnDone;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        btnDone = (ImageView) toolbarView.findViewById(R.id.btnDone);
        btnDone.setOnClickListener(this);

        setFragment(FrDetails.newInstance());
    }    

    @Override
    public void onClick(View v) {
        int viewId = v.getId();

        switch (viewId){
            case R.id.btnDone:

                BusProvider.getInstance().post(new DoneEvent());

                break;
            default:
                break;
        }
    }

    @Subscribe
    public void onDataFilled(DataFilledEvent event) {
        Log.e("Data filled", "Yessss");
    }
}
但是DataFilled事件不会从FrDetails片段的activityResult方法中激发到ChildActivity。我在FrBase片段中调用了register()和unregister()方法。FrDetails片段是FrBase片段的子级

public abstract class FrBase extends Fragment {
    ...

    @Override
    public void onResume() {
        super.onResume();
        BusProvider.getInstance().register(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        BusProvider.getInstance().unregister(this);
    }

}
这是我的课程:

import com.squareup.otto.Subscribe;

public class FrDetails extends FrBase implements View.OnClickListener{

...

   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View baseView = inflater.inflate(R.layout.one_fragment, null);
        button = (Button) baseView.findViewById(R.id.btn1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //WORK FINE HERE!
                BusProvider.getInstance().post(new DataFilledEvent());
            }
        });

        button2 = (Button) baseView.findViewById(R.id.btn2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getBaseActivity(), ThirdActivity.class);
                startActivityForResult(intent, SELECT_YEAR);
            }
        });
    }

    @Subscribe
    public void onDone(DoneEvent event) {
        //WORKS FINE HERE!
        Toast.makeText(getActivity(), "Done", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        //Log is called correctly
        Log.e("OK", "log");

        //DOENS'T WORK HERE!
        BusProvider.getInstance().post(new DataFilledEvent());

    }
}
为什么使用BusProvider.getInstance().post(新的DataFilled事件());不会将事件从onActivityResult()激发到ChildActivity吗?但若我们通过点击FrDetails片段中的按钮触发事件,那个么它是有效的

提前谢谢

基于(仅相关片段):

当活动重新启动时,您将在onResume()之前立即收到此调用

换句话说,事件在您的活动向总线注册之前触发,因为注册发生在
onResume()

如果希望能够在活动生命周期的早期阶段触发和接收事件,则应相应地更改注册(和注销)

或者,您也可以简单地注册到ActivityResult()。我已经有一段时间没有看Otto的代码了,但我认为注册一个已经注册的事件处理程序不会导致处理程序多次接收事件。请注意,在这种情况下,您必须考虑到您的活动可能未处于您预期的状态。也就是说,它将位于活动结果()和恢复()之间的某个位置(仅限相关代码段):

当活动重新启动时,您将在onResume()之前立即收到此调用

换句话说,事件在您的活动向总线注册之前触发,因为注册发生在
onResume()

如果希望能够在活动生命周期的早期阶段触发和接收事件,则应相应地更改注册(和注销)


或者,您也可以简单地注册到ActivityResult()。我已经有一段时间没有看Otto的代码了,但我认为注册一个已经注册的事件处理程序不会导致处理程序多次接收事件。请注意,在这种情况下,您必须考虑到您的活动可能未处于您预期的状态。也就是说,它将位于activityResult()和onResume()之间的某个位置,您可能要做的是将事件作为可运行事件发布。执行时,应该在注册eventbus的地方执行onStart | onResume

new Handler().post(new Runnable() {
        @Override
        public void run() {
            BusProvider.getInstance().post(new DataFilledEvent());
        }
    });

您可能想做的是将事件作为可运行事件发布。执行时,应该在注册eventbus的地方执行onStart | onResume

new Handler().post(new Runnable() {
        @Override
        public void run() {
            BusProvider.getInstance().post(new DataFilledEvent());
        }
    });