【问题标题】:Multiple onActivityResult for 1 Activity1 个活动的多个 onActivityResult
【发布时间】:2011-02-17 14:57:24
【问题描述】:

所以我正在开发一个非常简单的应用程序。其目的是从 1 台电脑和 1 或 2 台显示器收集资产数据。 我的表单包含 3 个 edittext 视图和 3 个按钮(一个用于我收集数据的每个资产)。这些按钮为条形码扫描仪调用 startActivityForResult,然后我想根据按下哪个按钮将结果传递给关联的edittext视图(例如:按“资产-PC”编辑文本右侧的“扫描”按钮,扫描并返回数据到它的关联编辑文本。然后,如果您按下“资产 - Mon1”编辑文本旁边的“扫描”按钮,将数据返回到“资产 - Mon1”编辑文本......等等......)

使用我这里的代码,所有项目都可以正常工作,只是不符合预期。按下任何“扫描”按钮始终会将结果返回到第一个 edittext 视图“资产 - PC”。

public class TestShit extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

    public void assetPcClick(View view) {
        Intent intent1 = new Intent("com.google.zxing.client.android.SCAN");
        intent1.setPackage("com.google.zxing.client.android");
        intent1.putExtra("SCAN_MODE", "ONE_D_MODE");
        startActivityForResult(intent1, 0);
    }   

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {
                String contents1 = intent.getStringExtra("SCAN_RESULT");
                String format1 = intent.getStringExtra("SCAN_RESULT_FORMAT");
                EditText assetPC = (EditText) findViewById(R.id.assetPC);
                assetPC.setText(contents1);
            } else if (resultCode == RESULT_CANCELED) {
                // Handle cancel
            }
        }
    }

    public void assetMon1Click(View view) {
        Intent intent2 = new Intent("com.google.zxing.client.android.SCAN");
        intent2.setPackage("com.google.zxing.client.android");
        intent2.putExtra("SCAN_MODE", "ONE_D_MODE");
        startActivityForResult(intent2, 0);
    }   

    public void onActivityResult2(int requestCode, int resultCode, Intent intent2) {
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {
                String contents2 = intent2.getStringExtra("SCAN_RESULT");
                String format2 = intent2.getStringExtra("SCAN_RESULT_FORMAT");
                EditText assetMon1 = (EditText) findViewById(R.id.assetMon1);
                assetMon1.setText(contents2);
            } else if (resultCode == RESULT_CANCELED) {
                // Handle cancel
            }
        }
    }

    public void assetMon2Click(View view) {
        Intent intent3 = new Intent("com.google.zxing.client.android.SCAN");
        intent3.setPackage("com.google.zxing.client.android");
        intent3.putExtra("SCAN_MODE", "ONE_D_MODE");
        startActivityForResult(intent3, 0);
    }   

    public void onActivityResult3(int requestCode, int resultCode, Intent intent3) {
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {
                String contents3 = intent3.getStringExtra("SCAN_RESULT");
                String format3 = intent3.getStringExtra("SCAN_RESULT_FORMAT");
                EditText assetMon2 = (EditText) findViewById(R.id.assetMon2);
                assetMon2.setText(contents3);
            } else if (resultCode == RESULT_CANCELED) {
                // Handle cancel
            }
        }
    }

}

关于如何更好地管理我的多个 "ActivityForResult" 和 "onActivityResult" 的任何建议?


我的修复,感谢您的所有帮助!

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {
                String contents1 = intent.getStringExtra("SCAN_RESULT");
                String format1 = intent.getStringExtra("SCAN_RESULT_FORMAT");
                EditText assetPC = (EditText) findViewById(R.id.assetPC);
                assetPC.setText(contents1);
            } else if (resultCode == RESULT_CANCELED) {
                // Handle cancel
            }
        }
        if (requestCode == 1) {
            if (resultCode == RESULT_OK) {
                String contents1 = intent.getStringExtra("SCAN_RESULT");
                String format1 = intent.getStringExtra("SCAN_RESULT_FORMAT");
                EditText assetMon1 = (EditText) findViewById(R.id.assetMon1);
                assetMon1.setText(contents1);
            } else if (resultCode == RESULT_CANCELED) {
                // Handle cancel
            }
        }
        if (requestCode == 2) {
            if (resultCode == RESULT_OK) {
                String contents1 = intent.getStringExtra("SCAN_RESULT");
                String format1 = intent.getStringExtra("SCAN_RESULT_FORMAT");
                EditText assetMon2 = (EditText) findViewById(R.id.assetMon2);
                assetMon2.setText(contents1);
            } else if (resultCode == RESULT_CANCELED) {
                // Handle cancel
            }
        }
    }    

【问题讨论】:

  • 请您选择一个正确的答案好吗?信用到信用到期的地方......;)

标签: android


【解决方案1】:

在您的startActivityForResult 中,不要在两个调用中都使用 0...使用不同的数字,例如 0 和 1...然后您可以使用 requestCode 在 onActivityResult 方法中实现开关。如果 requestCode = 0 则第一个方法已返回,如果为 1,则第二个方法已返回。对于更多的调用,这应该是相同的。

public void onActivityResult(int requestCode, int resultCode, Intent intent){
    switch(requestCode){
        case 0: // Do your stuff here...
        break;
        case 1: // Do your other stuff here...
        break;
        case etc:
        break;
    }
}

调用应该是这样的: (第一次)

startActivityForResult(intent1, 0);

(第二次)

startActivityForResult(intent2, 1);

(第三次)

startActivityForResult(intent3, 2);

(第n次)

startActivityForResult(intentn, n - 1);

或者,您可以声明要使用的静态 int 值,而不是更无法识别的 int 值。

【讨论】:

  • 谢谢。现在,我的垃圾看起来更干净了!哈哈。我会试一试,但我现在必须跑去上班。今天下午我会做,然后再回复一次,让大家知道我是怎么做的。
  • 这对我有用! switch case 是在单个 Activity 中管理不同请求的更好方法。
【解决方案2】:

当你 startActivityForResult 你用它发送一个请求代码, 对于您从按钮开始的每个活动,这应该是不同的(唯一的),例如按钮 1 开始活动请求代码 1、按钮 2 请求代码 = 2 和按钮 3 请求代码 = 3,那么对于您的父活动,您必须只有一个 onActivityResult() 在此函数中使用 switch case ,扫描请求代码,requestcode = 1 将给出第一个活动的结果,请求代码 =2 给出活动 2 的结果,依此类推...

【讨论】:

  • 谢谢。我现在正在研究“切换”选项。但是,我通过在 1 onActivityResult 下调用 3 个“if”语句来正常工作。将发布代码。任何有助于清理它的建议也会很棒。最终,我的应用程序中将会有很多这样的内容,而且由于我是 android 编程新手,我确信我的应用程序会变得臃肿,直到我学会了足够好的结构和压缩 LOL。
【解决方案3】:

Android 中没有任何东西会识别和调用名为 onActivityResult2 或 onActivityResult3 的方法。这些只是您编造的方法名称,系统将忽略它们。

您需要更改代码,以便在调用 startActivityForResult() 时传递不同的请求代码。 (requestCode 是该方法的第二个参数)

然后在 onActivityResult 检查 requestCode 以查看您从哪个活动获取结果,并进行相应处理。

【讨论】:

  • 谢谢。我想知道这一点,尽管 IDE 没有温暖我,所以我认为它会处理它。是的,这是我第一次真正尝试 Android 应用 :) 感谢您的帮助和耐心。
猜你喜欢
  • 2018-08-16
  • 1970-01-01
  • 2023-03-22
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2015-07-10
  • 1970-01-01
相关资源
最近更新 更多