1个活动的多个onActivityResult

时间:2011-02-17 14:57:25

标签: android

所以我有一个非常简单的应用程序,我正在努力。它的目的是从1台,1台或2台显示器收集资产数据。 我的表单包含3个edittext视图和3个按钮(我为每个资产收集一个数据)。按钮为条形码扫描器调用startActivityForResult,然后我想根据按下的按钮将结果传递给相关的edittext视图(例如:按“Asset - PC”edittext右侧的“scan”按钮,扫描并返回数据如果您按下“资产 - Mon1”编辑文本旁边的“扫描”按钮,则将数据返回到“资产 - Mon1”编辑文本....依此类推......)

使用我在这里的代码,所有项目都可以工作,而不是按照预期。按下任何“扫描”按钮始终会将结果返回到第一个edittext视图“Asset - 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
            }
        }
    }    

3 个答案:

答案 0 :(得分:35)

在你的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值。

答案 1 :(得分:3)

Android中没有任何东西可以识别并调用名为onActivityResult2或onActivityResult3的方法。这些只是您编写的方法名称,系统将忽略这些名称。

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

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

答案 2 :(得分:2)

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