Несколько onActivityResult для 1 действия

Итак, у меня очень простое приложение, над которым я работаю. Цель состоит в том, чтобы собирать данные активов с 1 шт. И 1 или 2 монитора. Моя форма содержит 3 вида edittext и 3 кнопки (по одному для каждого актива, для которого я собираю данные). Кнопки вызывают startActivityForResult для сканера штрих-кода, затем я хочу передать результат в соответствующее представление edittext, на основе которого была нажата кнопка (например: нажмите кнопку "scan" справа от данных "Asset-PC" edetchxt, scan and return к нему присоединяется edittext. Затем, если вы нажмете кнопку "scan", которая находится рядом с редактором "Asset - Mon1", верните данные в "Asset - Mon1" edittext.... и т.д.)

С кодом, который у меня есть здесь, все элементы работают, как раз не так, как предполагалось. Нажатие любой из кнопок "сканирования" всегда возвращает результат в первый вид 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
            }
        }
    }    

Ответы

Ответ 1

В вашем startActivityForResult, не используйте 0 для обоих вызовов... используйте разные числа, такие как 0 и 1... тогда вы можете реализовать переключатель в методе onActivityResult с помощью requestCode. Если 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.

Ответ 2

В Android нет ничего, что когда-либо будет распознавать и вызывать методы с именем onActivityResult2 или onActivityResult3. Это только имена методов, которые вы создали, которые будут игнорироваться системой.

Вам нужно изменить свой код таким образом, чтобы вы передавали другой код запроса, когда вы вызываете startActivityForResult(). (requestCode является вторым параметром для этого метода)

Затем в onActivityResult проверьте requestCode, чтобы узнать, из какого вида деятельности вы получаете результат, и обрабатывайте соответственно.

Ответ 3

Пока вы запускаетеActivityForResult, вы отправляете с ним код запроса, это должно быть другим (уникальным) для каждого вашего действия, которое вы начинаете с вашей кнопки, например, кнопка 1 запускает код запроса активности 1, кнопку 2 requestcode = 2 и кнопку запроса 3 = 3, а затем для вашей родительской активности вы должны иметь только один onActivityResult() в этой функции принимают случай переключения, сканируют коды запросов, requestcode = 1 даст результат от первой активности и код запроса = 2 дает для активности 2 и так далее...