【问题标题】:App crashes when calling startActivityForResult调用 startActivityForResult 时应用程序崩溃
【发布时间】:2017-08-14 21:09:56
【问题描述】:

我正在开发我的第一个 Android 应用,特别是在这种情况下,它可以帮助我更好地烹饪。我有 2 个活动,我目前正在努力,我的 MainActivity.java 和 whatCanIMake.java。当我使用 startActivity(intent) 从 MainActivity 启动 whatCanIMake 时,我能够使用 parcelables 传递对象,并且通常使用 whatCanIMake。我的问题是我希望能够传回我在 whatCanIMake 活动中更改的所有内容的列表。例如:我传入我当前拥有的所有成分的列表,然后 whatCanIMake 会删除食谱使用的成分。我想传回更新后的剩余成分列表。

我遇到的问题是startActivityForResult()。以前我成功地使用了startActivity(),用额外的包裹传递它的意图,鲍勃是你的叔叔。当我切换到startActivityForResult() 时,新活动无法启动,因为应用程序在点击onCreate() 之前崩溃了。显然这指向我对startActivityForResult() 的实现,所以我基本上已经阅读了与startActivityForResult() 相关的所有堆栈溢出问题,现在我在这里!

下面是我启动whatCanIMake的代码,还有onActivityResult()和whatCanIMake里面对应的代码。

这对我来说太奇怪了,我可以简单地将 startActivityForResult() 更改为 startActivity() 并且应用程序再次运行!提前感谢您的帮助。

MainActivity.java:

    public void searchRecipe(View view) {
        crossViewVariables.setMakeSort('a');
        Intent recipe = new Intent(this, whatCanIMake.class);
        recipe.putExtra("Pantry",stock);
        recipe.putExtra("Cookbook",activeCookbook);
        recipe.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
        startActivityForResult(recipe,R.integer.search_by_recipe);
        //startActivity(recipe);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode) {


            case (R.integer.search_by_recipe)://comes from Recipe Search?
                if (resultCode == Activity.RESULT_OK) {
                    Bundle b = data.getExtras();
                    stock = b.getParcelable("Pantry");
                }
                if (resultCode == Activity.RESULT_CANCELED) {

                }


            case (R.integer.search_by_ingredient)://comes from Recipe Search?
                if (resultCode == Activity.RESULT_OK) {
                    Bundle b = data.getExtras();
                    stock = b.getParcelable("Pantry");
                }
                if (resultCode == Activity.RESULT_CANCELED) {

                }


            case (R.integer.make_recipe)://comes from seeRecipe?
                if (resultCode == Activity.RESULT_OK) {
                    Bundle b = data.getExtras();
                    stock = b.getParcelable("Pantry");
                }
                if (resultCode == Activity.RESULT_CANCELED) {
                    Toast.makeText(getApplicationContext(), "Cancelled", Toast.LENGTH_LONG).show();
                }

            case (R.integer.edit_pantry):
                if (resultCode == Activity.RESULT_OK) {
                    Bundle b = data.getExtras();
                    stock = b.getParcelable("Pantry");
                }
        }
    }

whatCanIMake.java:

    Intent result = new Intent();
    result.putExtra("Pantry", stock);
    setResult(Activity.RESULT_OK,result);
    finish();

LogCat:

FATAL EXCEPTION: main
                                                                           Process: com.example.schre.mememachine, PID: 26721
                                                                           java.lang.IllegalStateException: Could not execute method for android:onClick
                                                                               at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                                                                               at android.view.View.performClick(View.java:5697)
                                                                               at android.widget.TextView.performClick(TextView.java:10826)
                                                                               at android.view.View$PerformClick.run(View.java:22526)
                                                                               at android.os.Handler.handleCallback(Handler.java:739)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:158)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                            Caused by: java.lang.reflect.InvocationTargetException
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                                                                               at android.view.View.performClick(View.java:5697) 
                                                                               at android.widget.TextView.performClick(TextView.java:10826) 
                                                                               at android.view.View$PerformClick.run(View.java:22526) 
                                                                               at android.os.Handler.handleCallback(Handler.java:739) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                               at android.os.Looper.loop(Looper.java:158) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:7224) 
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                                                                            Caused by: android.util.AndroidRuntimeException: FORWARD_RESULT_FLAG used while also requesting a result
                                                                               at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1884)
                                                                               at android.app.Instrumentation.execStartActivity(Instrumentation.java:1545)
                                                                               at android.app.Activity.startActivityForResult(Activity.java:4283)
                                                                               at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
                                                                               at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
                                                                               at android.app.Activity.startActivityForResult(Activity.java:4230)
                                                                               at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
                                                                               at com.example.schre.mememachine.MainActivity.searchRecipe(MainActivity.java:91)
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                                                                               at android.view.View.performClick(View.java:5697) 
                                                                               at android.widget.TextView.performClick(TextView.java:10826) 
                                                                               at android.view.View$PerformClick.run(View.java:22526) 
                                                                               at android.os.Handler.handleCallback(Handler.java:739) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                               at android.os.Looper.loop(Looper.java:158) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:7224) 
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

【问题讨论】:

  • 使用 LogCat 检查与您的崩溃相关的 Java 堆栈跟踪:stackoverflow.com/questions/23353173/…
  • 我更改了过滤设置,我找到了日志。我将编辑我的问题以包括它们!谢谢!

标签: java android android-intent


【解决方案1】:

删除这一行:

recipe.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);

startActivityForResult() 不需要它,这就是导致崩溃的原因。

【讨论】:

  • 我刚刚得出了同样的结论,我删除了它并且它起作用了!我只需要确保我更新了其余的活动调用以修复它们。非常感谢!
  • 我遇到了完全相同的问题,尽管我也没有这样的标志。会是什么原因?
  • @CanPoyrazoğlu:如果你得到FORWARD_RESULT_FLAG used while also requesting a result——如问题中的堆栈跟踪所示——那么在你用于startActivityForResult()Intent中添加了FLAG_ACTIVITY_FORWARD_RESULT。这就是问题中崩溃的根本原因。
  • 在问了一个问题后,结果发现罪魁祸首是一些非常模糊的东西:我在活动请求代码中使用了随机的多位数字。似乎 Android 不喜欢大量的请求代码。我已将代码更改为 4 位整数,它立即生效。真的很奇怪。
  • @CanPoyrazoğlu:从FragmentActivity 扩展时,请求代码值存在限制(例如,从AppCompatActivity 继承):developer.android.com/reference/android/support/v4/app/…
【解决方案2】:

代替:

startActivityForResult(recipe,R.integer.search_by_recipe);

试试这个:

startActivityForResult(recipe, getResources().getInteger(R.integer.search_by_recipe));

【讨论】:

  • 我会试一试,我会报告的。感谢您的建议!
  • 似乎没有任何帮助
猜你喜欢
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多