【问题标题】:onActivityResult doesn't get called by finish() when the parent activity is passed as parameter to an intent in a non-activity class当父活动作为参数传递给非活动类中的意图时,完成()不会调用 onActivityResult
【发布时间】:2016-07-29 03:02:46
【问题描述】:

我有一个处理问题序列的类。它不会扩展 Activity。类中有方法:

public class QuizMaster {
    public void startQuiz(Activity activity, Model model) {
        //switch - case statement using model

        Intent intent = new Intent(activity, QuestionTextActivity.class)
        activity.startActivityForResult(intent, requestCode);

        //other case statements with other intents
    }
}

当我使用

从工作活动中调用此方法时
mQuizMaster.startQuiz(this, mModel);

我完成()子活动:

Intent returnIntent = new Intent();
returnIntent.putExtra(ARG_SELECTED_CHECKBOX, checkedBox);
setResult(RESULT_CODE, returnIntent);
finish();

它不执行父活动的

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    Log.d(LOG_TAG, "OnActivityResult called in SignDetailsActivity. Resultcode is: ");
}

但是当我执行

Intent intent = new Intent(activity, QuestionTextActivity.class)
activity.startActivityForResult(intent, requestCode);

在实际的父活动文件中,它确实执行了 onActivityResult 方法。

如果子活动与非活动类一起发送,为什么子活动不运行父活动中的onActivityResult?我该如何解决这个问题?

我没有发现任何人在像这样的非活动类中执行 new Intent() 时遇到同样的问题。如果有人,我没有使用正确的搜索关键字,其他一些人可能会像我一样输入并进入此页面。

【问题讨论】:

  • 新的 Intent 没有启动 Activity,你的代码中一定有“startActivity”或“startActivityForResult”之类的东西..你能更新你的代码示例吗?
  • 抱歉,我忘了在问题中添加那行代码。
  • 这是一个有 7 个案例的开关,它们都将不同的子类置于意图中。选择一个后,它总是执行 4 inent.putExtra 和 activity.startActivityForResult(intent, requestCode)。

标签: android android-intent android-activity onactivityresult


【解决方案1】:

您需要在调用 finish() 之前调用 setResult(int)。这是来自活动documentation

当一个activity退出时,它可以调用setResult(int)返回数据 给它的父母。它必须始终提供一个结果代码,它可以是 标准结果 RESULT_CANCELED、RESULT_OK 或任何自定义值 从 RESULT_FIRST_USER 开始。此外,它可以选择返回 返回一个包含它想要的任何附加数据的 Intent。所有这些 信息出现在父级的 Activity.onActivityResult() 上, 以及它最初提供的整数标识符。

这是我的实现,它有效:

MainActivity.java(父活动)

public class MainActivity extends AppCompatActivity {

    private Sample sample;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sample = new Sample();
                sample.startActivity(MainActivity.this);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d("TEST", "DONE");
    }
}

LaunchActivity.java(子活动)

public class LaunchActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launch);

        Button btn = (Button) findViewById(R.id.button2);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setIntent(new Intent());
                finish();
            }
        });
    }
}

Sample.java(类开始活动)

public class Sample {

    public Sample () {}

    public void startActivity (Activity a) {
        Intent it = new Intent(a, LaunchActivity.class);
        a.startActivityForResult(it, 0);
    }

}

【讨论】:

  • 对不起,我没有添加那段代码。我确实调用了 setResult,我现在将其添加到问题中。
  • 当我不更改子活动,而是从实际的父活动中调用它,而不是从我使用 .startQuiz(this, mModel) 从父活动调用的非活动类中调用它时,它确实在完成()时调用 onActivityResult
  • 这很有趣...你能添加你的 onActivityResult 代码吗?因为它应该按照this工作。
  • 我现在已经添加了完整的 onActivityResult。虽然它不应该是相关的,因为该方法根本没有被调用。
  • 我用你的实现测试了自己,它实际上对我有用。我将在此答案中发布我的版本,看看它是否回答了您的问题。
猜你喜欢
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
相关资源
最近更新 更多