Pertanyaan Bagaimana cara mengelola `startActivityForResult` di Android?


Dalam aktivitas saya, saya menyebut aktivitas kedua dari aktivitas utama oleh startActivityForResult. Dalam aktivitas kedua saya ada beberapa metode yang menyelesaikan kegiatan ini (mungkin tanpa hasil), namun, hanya satu dari mereka yang mengembalikan hasil.

Misalnya, dari aktivitas utama saya sebut yang kedua. Dalam aktivitas ini saya memeriksa beberapa fitur handset seperti apakah ada kamera. Jika tidak ada maka saya akan menutup kegiatan ini. Juga, selama persiapan MediaRecorder atau MediaPlayer jika masalah terjadi maka saya akan menutup aktivitas ini.

Jika perangkatnya memiliki kamera dan rekaman dilakukan sepenuhnya, maka setelah merekam video jika pengguna mengklik tombol selesai maka saya akan mengirim hasilnya (alamat video yang direkam) kembali ke aktivitas utama.

Bagaimana cara memeriksa hasil dari aktivitas utama?


780
2018-05-02 03:03


asal


Jawaban:


Dari kamu FirstActivity panggil SecondActivity menggunakan startActivityForResult() metode

Sebagai contoh:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

Di dalam Anda SecondActivity mengatur data yang ingin Anda kembalikan kembali FirstActivity. Jika Anda tidak ingin kembali, jangan setel.

Sebagai contoh: Dalam Aktivitas kedua jika Anda ingin mengirim kembali data:

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

Jika Anda tidak ingin mengembalikan data:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Sekarang di kelas FirstActivity Anda menulis kode berikut untuk onActivityResult() metode.

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

    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}//onActivityResult

2071
2018-05-02 03:36



Bagaimana cara memeriksa hasil dari kegiatan utama?

Anda perlu mengesampingkan Activity.onActivityResult() lalu periksa parameternya:

  • requestCode mengidentifikasi aplikasi mana yang mengembalikan hasil ini. Ini ditentukan oleh Anda saat Anda menelepon startActivityForResult().
  • resultCode memberi tahu Anda apakah aplikasi ini berhasil, gagal, atau sesuatu yang berbeda
  • data menyimpan informasi apa pun yang dikembalikan oleh aplikasi ini. Ini mungkin null.

40
2018-05-02 03:07



Melengkapi jawaban dari @ Nishant, cara terbaik untuk mengembalikan hasil kegiatan adalah:

Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();

Saya mengalami masalah dengan

new Intent();

Kemudian saya menemukan bahwa cara yang benar digunakan

getIntent();

untuk mendapatkan maksud saat ini


30
2018-05-26 20:40



Contoh

Untuk melihat seluruh proses dalam konteks, di sini adalah jawaban tambahan. Lihat jawaban saya yang lebih lengkap untuk penjelasan lebih lanjut.

enter image description here

MainActivity.java

public class MainActivity extends AppCompatActivity {

    // Add a different request code for every activity you are starting from here
    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) { // Activity.RESULT_OK

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

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

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

22
2017-12-05 08:36



Jika Anda ingin memperbarui antarmuka pengguna dengan hasil aktivitas, Anda tidak dapat menggunakannya this.runOnUiThread(new Runnable() {} Melakukan hal ini UI tidak akan menyegarkan dengan nilai baru. Sebagai gantinya, Anda dapat melakukan ini:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_CANCELED) {
        return;
    }

    global_lat = data.getDoubleExtra("LATITUDE", 0);
    global_lng = data.getDoubleExtra("LONGITUDE", 0);
    new_latlng = true;
}

@Override
protected void onResume() {
    super.onResume();

    if(new_latlng)
    {
        PhysicalTagProperties.this.setLocation(global_lat, global_lng);
        new_latlng=false;
    }
}

Ini tampak konyol tetapi bekerja dengan sangat baik.


9
2018-03-08 13:54



Bagi mereka yang memiliki masalah salah requestCode di onActivityResult

Jika Anda menelepon startActivityForResult() dari kamu Fragment, requestCode diubah oleh Activity yang memiliki Fragment.

Jika Anda ingin mendapatkan hasil yang benarKode dalam aktivitas Anda coba ini:

Perubahan:

startActivityForResult(intent, 1); Untuk:

getActivity().startActivityForResult(intent, 1);


9
2017-10-23 12:58



Pertama Anda gunakan startActivityForResult() dengan parameter pada awalnya Activity dan jika Anda ingin mengirim data dari detik Activity untuk pertama Activity kemudian berikan nilai menggunakan Intent dengan setResult() metode dan memasukkan data itu ke dalamnya onActivityResult() metode pertama Activity.


2
2017-09-30 12:30



Masalah yang sangat umum di android
Itu bisa dipecah menjadi 3 buah
1) mulai Aktivitas B (Terjadi dalam Aktivitas A)
2) Setel data yang diminta (Terjadi di activty B)
3) Menerima data yang diminta (Terjadi dalam aktivitas A)

1) startActivity B

Intent i = new Intent(A.this, B.class);
startActivity(i);

2) Setel data yang diminta

Di bagian ini Anda memutuskan apakah Anda ingin mengirim kembali data atau tidak ketika suatu peristiwa tertentu terjadi.
Misalnya: Dalam aktivitas B ada EditText dan dua tombol b1, b2.
Mengklik pada Tombol b1 mengirim data kembali ke actvity A
Mengklik Tombol b2 tidak mengirim data apa pun.

Mengirim data 

b1......clickListener
{
   Intent resultIntent = new Intent();
   resultIntent.putExtra("Your_key","Your_value");
   setResult(RES_CODE_A,resultIntent);
   finish();
}

Tidak mengirim data

b2......clickListener
    {
       setResult(RES_CODE_B,new Intent());
       finish();
    }

pengguna mengklik tombol kembali
Secara default, hasil ditetapkan dengan kode respons Activity.RESULT_CANCEL

3) Tarik hasil

Untuk itu mengganti metode onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RES_CODE_A) {

     // b1 was clicked 
   String x = data.getStringExtra("RES_CODE_A");

}
else if(resultCode == RES_CODE_B){

   // b2 was clicked

}
else{
   // back button clicked 
}
}

0
2017-12-22 09:54



Anserver dari @Nishant benar. Dalam kasus saya, onActivityResult tidak pernah dipanggil karena pengaturan di AndroidManifest. Pastikan aktivitas kedua Anda (atau pengirim) tidak menetapkan baris ini di Manifes Android.

<activity android:name=".SecondViewActivity"
            android:parentActivityName=".FirstActivity"/>

Jika demikian silakan hapus android:parentActivityName=".FirstActivity"


-1
2018-02-27 12:26