除非我从片段调用startActivityForResult时使用getActivity(),否则onActivityResult永远不会触发

时间:2014-08-06 19:07:46

标签: android-dialogfragment onactivityresult start-activity

我的主要活动会在列表视图中打开一个包含2个项目的对话框片段。单击其中任何一个都会启动一个新活动。除非我使用getActivity()。startActivityForResult(),否则onActivityResult的代码永远不会运行。我在这里读到的所有内容都不鼓励使用getActivity()。startActivityForResult()并且只是使用startActivityForResult()。通常情况下,我会说“无关紧要,代码有效”,但它让我疯狂,为什么它如此沮丧以及为什么没有getActivity()它就无法工作。我一直在倾注文档,无法找到答案,帮助我stackoverflow,你是我唯一的希望。

我的onActivityResult()代码位于我的主要活动(Landing.class)中:

    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    String s = "";
    Session current = new Session();
    Gson gson = new Gson();

    if (resultCode == RESULT_OK) {
        if (requestCode == 1) {
            s = data.getStringExtra("SESSION_JSON");
            current = gson.fromJson(s, Session.class);
        }
    }
    sessions.add(current);
    adapter.notifyDataSetChanged();
}

调用位于我的DialogFragment类中的startActivityForResult()的代码:

    @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    dismiss();
    if (position == 0) {
        Intent intent = new Intent(getActivity(), ActiveSessionActivity.class);
        getActivity().startActivityForResult(intent, 1);
    }
}

ActiveSessionActivity类中的代码应该在我的主要活动中将结果返回给onActivityResult():

    public void saveSession(View v) {
    Session session;

    Gson gson = new Gson();
    String json = gson.toJson(session);

    Intent intent = new Intent();
    intent.putExtra("SESSION_JSON", json);
    setResult(RESULT_OK, intent);
    finish();
}

1 个答案:

答案 0 :(得分:1)

Android DialogFragments仍然是片段,因此从对话框中调用startActivityForResult实际上会在对话框中获得结果。如果你要在DialogFragment中实现onActivityResult,你将得到你的回调。不建议使用getActivity()。startActivityForResult()的原因是因为对话框无法控制活动,因此可能不再附加它。尝试...

if (getActivity() != null && !isDetached() && !isRemoving()) {
  getActivity().startActivityForResult(...);
}