Bagaimana cara mengirimkan data dari aktivitas 2 ke aktivitas 1 saat ditekan kembali? - android

186

Saya memiliki 2 aktivitas, Activity1 dan Activity2 .

Di Activity1Saya sudah Tombol dan TextView . Ketika tombol diklik Activity2 dimulai.

Di Activity2Saya sudah EditText .

Saya ingin menampilkan data yang diambil dari EditText di Activity2 di TextView di Activity1 ketika kembali ditekan dari Activity2 .

dapatkah seseorang membantu saya dengan kode untuk membuat ini berfungsi?

kumareloaded
sumber
2
baca tentangstartActivityForResult
Dmitry Zaytsev
Cara lain: Activity2menempatkan nilai dalam penyimpanan persisten dan Activity1membacanya dari sana.
Henry
@kumareloaded: Bisakah Anda berbagi solusinya di sini. Pastebin tidak bekerja di negara saya seperti sekarang.
user1903022

Jawaban:

328

Mulai Activity2 dengan startActivityForResultdan gunakan setResultmetode untuk mengirim data kembali dari Activity2 ke Activity1. Di Activity1 Anda harus mengganti onActivityResultuntuk memperbarui TextViewdengan EditTextdata dari Activity2.

Sebagai contoh:

Di Activity1 , mulai Activity2 sebagai:

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

Di Activity2 , gunakan setResultuntuk mengirim kembali data:

Intent intent = new Intent();
intent.putExtra("editTextValue", "value_here")
setResult(RESULT_OK, intent);        
finish();

Dan di Activity1 , terima data dengan onActivityResult:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             String strEditText = data.getStringExtra("editTextValue");
         }     
    }
} 

Jika Anda bisa, gunakan juga SharedPreferences untuk berbagi data di antara Aktivitas.

ρяσѕρєя K
sumber
1
terima kasih bung, jika Anda bisa, tolong bantu saya dengan bagian pengkodean yang serupa untuk SharedPreferences untuk melakukan hal yang sama :)
kumareloaded
1
@kumareloaded: selamat datang teman. jika Anda ingin melakukan hal yang sama, SharedPreferencesmaka lihat contoh ini
ρяσѕρєя K
2
@kumareloaded: jika Anda memberi saya tautan kode dari kedua kelas dengan apa yang telah Anda coba gunakan pastebin.com maka saya akan mengedit kode Anda
ρяσѕρєя K
1
@kumareloaded: sekarang gunakan kode ini dan ini akan berhasil
ρяσѕρєя K
1
@ ρяσѕρєяK: Bisakah Anda membagikan kode untuk skenario di atas menggunakan SharedPref dalam jawaban Anda. Pastebin tidak terbuka di banyak negara. Berbagi di sini akan sangat membantu, terima kasih.
user1903022
27

Activity1 harus memulai Activity2 dengan startActivityForResult().

Activity2 harus digunakan setResult()untuk mengirim data kembali ke Activity1 .

Dalam Activity2 ,

@Override
public void onBackPressed() {
    String data = mEditText.getText();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(resultcode, intent);
}

Dalam Activity1 ,

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}
Swayam
sumber
@Sam, saya kira karena Anda tidak menyebutkan activity1 harus memulai activity2 dengan startactivityforresult.
LutfiTekin
1
@ LutfiTekin: Itu mungkin saja! Terima kasih telah menunjukkannya! Sunting jawaban saya. :)
Swayam
17

Jawaban lain tidak bekerja ketika saya meletakkan setResultdi onBackPressed. Mengomentari panggilan ke super onBackPresseddan menelepon finishsecara manual memecahkan masalah:

@Override
public void onBackPressed() {
    //super.onBackPressed();
    Intent i = new Intent();
    i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
    setResult(RESULT_OK, i);
    finish();
}

Dan dalam aktivitas pertama:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == QUEUE_MSG) {
        if (resultCode == RESULT_OK) {
            Serializable tmp = data.getSerializableExtra(MainActivity.EXTRA_NON_DOWNLOADED_PAGES);
            if (tmp != null)
                serializable = tmp;
        }
    }
}
TemukanOut_Quran
sumber
6

Ambil ini sebagai alternatif dari startActivity untukResult.Tetapi perlu diketahui bahwa untuk kasus seperti itu pendekatan ini bisa mahal dalam hal kinerja tetapi dalam beberapa kasus Anda mungkin perlu menggunakan.

Dalam Activity2,

@Override
public void onBackPressed() {
String data = mEditText.getText();
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
Editor editor = sp.edit();
editor.putString("email",data);
editor.commit();
}

Dalam Activity1,

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 
katmanco
sumber
Ini tidak dapat digunakan untuk objek (hanya string, boolean, dll)
FindOut_Quran
1
Dalam kasus saya, saya meluncurkan aktivitas dari item daftar di MainActivity dan ingin mendapatkan data yang dibuat pengguna kembali ke item daftar itu. startActivityForResult () tidak tersedia untuk saya dalam kasus ini di mana saya menggunakan mContext.startActivity (). @katmanco contoh di sini adalah pekerjaan yang bermanfaat di sekitar.
Kerusakan
bagi saya itu adalah pemilihan yang buruk. exist actionForResult
marlonpya
3

Dari FirstActivity Anda, panggil SecondActivity menggunakan metode startActivityForResult ().

Sebagai contoh:

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

Di SecondActivity Anda, atur data yang ingin Anda kembalikan ke FirstActivity. Jika Anda tidak ingin kembali, jangan atur apa pun.

Misalnya: Di secondActivity 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, tulis kode berikut untuk metode onActivityResult ().

@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
        }
    }
}
Manoj Reddy
sumber
2

ini adalah Activity1 pertama Anda.

public class Activity1 extends Activity{
private int mRequestCode = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, Activity2.class);
    startActivityForResult(intent, mRequestCode);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == mRequestCode && resultCode == RESULT_OK){
        String editTextString = data.getStringExtra("editText");
    }
}
}

Dari sini Anda memulai Activity2.class Anda dengan menggunakan startActivityForResult (mRequestCode, Activity2.class);

Sekarang ini adalah Aktivitas kedua Anda, nama adalah Activity2

public class Activity2 extends Activity {
private EditText mEditText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //mEditText = (EditText)findViewById(R.id.edit_text);

    Intent intent = new Intent();
    intent.putExtra("editText", mEditText.getText().toString());
    setResult(RESULT_OK, intent);
}

}

Sekarang ketika Anda selesai dengan Aktivitas kedua Anda maka Anda memanggil metode setResult (), dari onBackPress () atau dari sembarang tombol klik ketika Activity2 Anda akan dihancurkan maka metode panggilan balik Activity1 Anda diActivityResult () akan memanggil dari sana Anda bisa mendapatkan data dari niat ..

Semoga ini bisa membantu Anda ... :)

vishesh chandra
sumber
1

TL; Penggunaan DR Activity.startActivityForResult

Jawaban panjang:

Anda harus mulai dengan membaca dokumentasi pengembang Android. Khususnya topik pertanyaan Anda dicakup dalam Starting Activities and Getting Resultsbagian Activitydokumentasi.

Adapun kode contoh, Android SDK memberikan contoh yang baik. Juga, jawaban lain di sini memberi Anda potongan kode sampel pendek untuk digunakan.

Namun, jika Anda mencari alternatif, baca pertanyaan SO ini . Ini adalah diskusi yang baik tentang cara menggunakan startActivityForResultsdengan fragmen, serta beberapa pendekatan lain untuk meneruskan data antar kegiatan.

Franci Penov
sumber
0

dan saya memiliki masalah yang ingin saya lakukan pada pengiriman tipe data ini di Soft Button yang saya buat dan softKey yang merupakan default di setiap Perangkat Android, jadi saya sudah melakukan ini, pertama saya buat Intentdi saya "A" Activity:

            Intent intent = new Intent();
            intent.setClass(context, _AddNewEmployee.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, 6969);
            setResult(60);

Kemudian di Aktivitas kedua saya, saya telah mendeklarasikan Field di "B" saya Activity:

private static int resultCode = 40;

kemudian setelah saya membuat permintaan saya berhasil atau setiap kali saya ingin memberi tahu "A" Kegiatan bahwa pekerjaan ini berhasil dilakukan di sini mengubah nilai resultCode ke yang sama saya katakan dalam "A" Activityyang dalam kasus saya adalah "60" dan kemudian:

private void backToSearchActivityAndRequest() {
    Intent data = new Intent();
    data.putExtra("PhoneNumber", employeePhoneNumber);
    setResult(resultCode, data);
    finish();
}

@Override
public void onBackPressed() {
    backToSearchActivityAndRequest();
}

PS: Ingatlah untuk menghapus Superdari Metode onBackPressed jika Anda ingin ini berfungsi dengan baik.

maka saya harus memanggil onActivityResultMetode dalam Aktivitas "A" saya juga:

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 6969 && resultCode == 60) {
            if (data != null) {
                    user_mobile = data.getStringExtra("PhoneNumber");
                    numberTextField.setText(user_mobile);
                    getEmployeeByNumber();
            }
        }
    }

itu saja, semoga membantu anda. #HappyCoding;

Arash Afsharpour
sumber