Mengirim data kembali ke Aktivitas Utama di Android

295

Saya memiliki dua kegiatan: aktivitas utama dan aktivitas anak.
Ketika saya menekan tombol di aktivitas utama, aktivitas anak diluncurkan.

Sekarang saya ingin mengirim beberapa data kembali ke layar utama. Saya menggunakan kelas Bundle, tetapi tidak berfungsi. Itu melempar beberapa pengecualian runtime.

Apakah ada solusi untuk ini?

Rajapanda
sumber
Satu trik lagi mendefinisikan ArrayList dalam aktivitas utama Anda dan menjadikannya statis sehingga Anda dapat mengaksesnya di aktivitas kedua kemudian menambahkan data di dalamnya yang ingin Anda kirim ke aktivitas utama kemudian Anda mengaksesnya di aktivitas utama
Abhishek Yadav
Abhishek Yadav, bagaimana jika aktivitas utama Anda akan menghancurkan (onDestroy () callback). Saya pikir itu bukan saran yang sangat bagus.
Leontsev Anton

Jawaban:

473

Ada beberapa cara untuk mencapai apa yang Anda inginkan, tergantung pada kondisinya.

Skenario yang paling umum (yang terdengar seperti milik Anda) adalah ketika Aktivitas anak digunakan untuk mendapatkan input pengguna - seperti memilih kontak dari daftar atau memasukkan data dalam kotak dialog. Dalam hal ini Anda harus menggunakannya startActivityForResultuntuk meluncurkan Aktivitas anak Anda.

Ini menyediakan jalur pipa untuk mengirim data kembali ke Aktivitas utama menggunakan setResult. Metode setResult mengambil nilai hasil int dan Intent yang dikembalikan ke Activity calling.

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

Untuk mengakses data yang dikembalikan dalam penggantian Aktivitas panggilan onActivityResult. RequestCode sesuai dengan bilangan bulat yang diteruskan dalam startActivityForResultpanggilan, sedangkan resultCode dan Intent data dikembalikan dari Activity anak.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}
Reto Meier
sumber
4
untuk kelengkapan, orang harus menyebutkan tempat terbaik untuk menelepon ()? Mungkin jelas bagi para ahli, tetapi bagi para pemula akan lebih baik untuk mengetahui tanpa merujuk sumber tambahan.
Califf
1
@ jelmoodjasser Butuh sedikit waktu untuk mencari tahu, tetapi pada dasarnya ketika Anda memulai aktivitas baru dengan Intent, Anda perlu menggunakan startActivityForResultfungsi alih-alih hanya startActivity. Contoh mungkin di startActivityForResult(myIntent, 2);mana 2 adalah kode hasil, yang dapat menggantikan MY_CHILD_ACTIVITYdalam pernyataan switch di atas.
Spotlight
ketika aktivitas kedua selesai dan kembali ke aktivitas pertama lalu cara mengatur requestCode ke aktivitas kedua sebelum menyelesaikannya .... untuk menggunakannya pada onActivityResult in FirstActivity
Ahamadullah Saikat
Apakah Intent wajib? Jika saya tidak punya sesuatu untuk dikirim kembali, apakah saya perlu niat kosong untuk dikirim kembali?
Bagus Aji Santoso
Maksud @BagusAjiSantoso adalah opsional, hanya diperlukan jika Anda memiliki sesuatu untuk dikirim kembali.
Narendra Singh
186

Aktivitas 1 menggunakan startActivityForResult :

startActivityForResult(ActivityTwo, ActivityTwoRequestCode);

Kegiatan 2 diluncurkan dan Anda dapat melakukan operasi, untuk menutup Kegiatan lakukan ini:

Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();

Aktivitas 1 - kembali dari aktivitas sebelumnya akan memanggil onActivityResult :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
        num1 = data.getIntExtra(Number1Code);
        num2 = data.getIntExtra(Number2Code);
    }
}

UPDATE: Jawaban untuk komentar Seenu69, Dalam aktivitas dua,

int result = Integer.parse(EditText1.getText().toString()) 
           + Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);

Kemudian dalam aktivitas satu,

int result = data.getExtra(KEY_RESULT);
menarik perhatian
sumber
Halo, saya menghargai Anda karena menjawab pertanyaan saya. Kode ini tidak cukup untuk saya. Saya ingin penambahan dilakukan dalam aktivitas kedua itu sendiri dan hasilnya harus dikembalikan ke MainActivity melalui metode onActivityResult. Misalnya hanya ada tombol di Aktivitas Utama yang membawa Anda ke aktivitas kedua saat mengkliknya, ada dua angka yang dimasukkan melalui widget EditText, logika penambahan dilakukan di aktivitas kedua itu sendiri dan akhirnya hasilnya dikembalikan ke MainActivity. Mengerti?
Seenu69
2
Dalam hal ini dalam aktivitas kedua, Anda akan melakukan perhitungan dan menyimpan hasilnya dalam maksud dengan putExtra (). Saya telah mengedit jawaban saya di atas
jimmithy
68

Mengirim Kembali Data

Ini membantu saya melihat berbagai hal dalam konteks. Ini adalah proyek sederhana lengkap untuk mengirim data kembali. Alih-alih menyediakan file tata letak xml, ini adalah gambar.

masukkan deskripsi gambar di sini

Aktifitas utama

  • Mulailah Aktivitas Kedua dengan startActivityForResult, berikan kode hasil yang sewenang-wenang.
  • Timpa onActivityResult. Ini disebut ketika Aktivitas Kedua selesai. Anda dapat memastikan bahwa itu sebenarnya Aktivitas Kedua dengan memeriksa kode permintaan. (Ini berguna ketika Anda memulai beberapa aktivitas berbeda dari aktivitas utama yang sama.)
  • Ekstrak data yang Anda dapatkan dari pengembalian Intent. Data diekstraksi menggunakan pasangan kunci-nilai.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    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) {

                // 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);
            }
        }
    }
}

Aktivitas kedua

  • Masukkan data yang ingin Anda kirim kembali ke aktivitas sebelumnya ke dalam Intent. Data disimpan dalam Intentpasangan kunci-nilai.
  • Tetapkan hasilnya ke RESULT_OKdan tambahkan maksud menyimpan data Anda.
  • Panggilan finish()untuk menutup Aktivitas Kedua.

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();
    }
}

Catatan lain

  • Jika Anda berada dalam Fragmen itu tidak akan tahu artinya RESULT_OK. Hanya menggunakan nama lengkap: Activity.RESULT_OK.

Lihat juga

Suragch
sumber
Itu adalah penjelasan eksplisit yang ditulis dengan sangat baik. Sudah selesai dilakukan dengan baik!
Kingsley Ijike
29

FirstActivity menggunakan startActivityForResult:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int requestCode); // suppose requestCode == 2

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 2)
    {
        String message=data.getStringExtra("MESSAGE");
    }
}

Pada panggilan SecondActivity setResult () onClick events atau onBackPressed ()

Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(Activity.RESULT_OK, intent);
Vijay
sumber
Apakah ini resultCode dari requestCode?
Engr Syed Rowshan Ali
15

Panggil Intensi aktivitas anak menggunakan pemanggilan metode startActivityForResult ()

Ada contohnya di sini: http://developer.android.com/training/notepad/notepad-ex2.html

dan di "Mengembalikan Hasil dari Layar" ini: http://developer.android.com/guide/faq/commontasks.html#opennewscreen

Intrikasi
sumber
Ya, saya setuju dengan cbrulak, tautan ke dokumen jauh lebih membantu daripada jawabannya.
george_h
Tautan menunjukkan beberapa hal umum sekarang. Konten dapat diubah, perbarui atau hapus jawaban untuk komunitas
Manoranjan
7

Saya telah membuat kelas demo sederhana untuk referensi Anda yang lebih baik.

FirstActivity.java

 public class FirstActivity extends AppCompatActivity {

    private static final String TAG = FirstActivity.class.getSimpleName();
    private static final int REQUEST_CODE = 101;
    private Button btnMoveToNextScreen;

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

        btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
        btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivityForResult(mIntent, REQUEST_CODE);
            }
        });
    }

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

        if(resultCode == RESULT_OK){
            if(requestCode == REQUEST_CODE && data !=null) {
                String strMessage = data.getStringExtra("keyName");
                Log.i(TAG, "onActivityResult: message >>" + strMessage);
            }
        }

    }
}

Dan di sini adalah SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    private static final String TAG = SecondActivity.class.getSimpleName();
    private Button btnMoveToPrevious;
    private EditText editText;

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

        editText = (EditText) findViewById(R.id.editText);

        btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
        btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String message = editText.getEditableText().toString();

                Intent mIntent = new Intent();
                mIntent.putExtra("keyName", message);
                setResult(RESULT_OK, mIntent);
                finish();

            }
        });

    }
}
Kuls
sumber
3
dijelaskan dengan baik!
Radhey
5

Pada aktivitas pertama, Anda dapat mengirim maksud menggunakan startActivityForResult()dan kemudian mendapatkan hasil dari aktivitas kedua setelah selesai digunakan setResult.

MainActivity.class

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_RESULT_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);
        // send intent for result 
        startActivityForResult(intent, SECOND_ACTIVITY_RESULT_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_RESULT_CODE) {
            if (resultCode == 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);
            }
        }
    }
}

Kelas II

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();
    }
}
Yogesh Adhe
sumber
1

Semua jawaban ini menjelaskan skenario aktivitas kedua Anda harus selesai setelah mengirim data.

Tetapi jika Anda tidak ingin menyelesaikan aktivitas kedua dan ingin mengirim data kembali ke pertama maka untuk itu Anda dapat menggunakan BroadCastReceiver.

Dalam Aktivitas Kedua -

Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

Dalam Aktivitas Pertama -

private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do some action
    }
};

Daftarkan penerima di onCreate () -

 LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));

Batalkan registrasi di onDestroy ()

Shivam Yadav
sumber
0

Cara lain untuk mencapai hasil yang diinginkan yang mungkin lebih baik tergantung pada situasi Anda adalah membuat antarmuka pendengar.

Dengan membuat aktivitas orang tua mendengarkan antarmuka yang dipicu oleh aktivitas anak sambil meneruskan data yang diperlukan sebagai parameter dapat membuat seperangkat keadaan yang serupa

Lenos
sumber
-1

Ada beberapa cara untuk melakukan ini. 1. dengan menggunakan startActivityForResult () yang dijelaskan dengan sangat baik dalam jawaban di atas.

  1. dengan membuat variabel statis di kelas "Utils" Anda atau kelas lain Anda sendiri. Misalnya saya ingin meneruskan studentId dari ActivityB ke ActivityA.First pertama ActivityA saya memanggil ActivityB. Kemudian di dalam ActivityB atur studentId (yang merupakan bidang statis di Utils.class). Suka Utils.STUDENT_ID = "1234" ini; kemudian saat kembali ke ActivityA gunakan studentId yang disimpan di Utils.STUDENT_ID.

  2. dengan membuat metode pengambil dan penyetel di Kelas Aplikasi Anda.

seperti ini:

public class MyApplication extends Application {

    private static MyApplication instance = null;
    private String studentId="";

    public static MyApplication getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public void setStudentId(String studentID){
        this.studentId=studentID;
    }

    public String getStudentId(){
        return this.studentId;
    }
}

jadi kamu sudah selesai. cukup atur data di dalamnya ketika Anda berada di ActivityB dan setelah kembali ke ActivityA, dapatkan datanya.

swetabh suman
sumber
-1

Hanya detail kecil yang menurut saya tidak ada dalam jawaban di atas.

Jika aktivitas anak Anda dapat dibuka dari beberapa aktivitas orang tua, maka Anda dapat memeriksa apakah Anda perlu melakukannya setResultatau tidak, berdasarkan apakah aktivitas Anda dibuka oleh startActivityatau startActivityForResult. Anda dapat mencapai ini dengan menggunakan getCallingActivity(). Info lebih lanjut di sini .

Dhruv Jagetiya
sumber
-2

Gunakan SharedPreferences dan simpan data Anda dan akses dari mana saja di aplikasi

simpan tanggal seperti ini

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();

Dan terima data seperti ini

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String savedPref = sharedPreferences.getString(key, "");
    mOutputView.setText(savedPref);
Pengembang Hibrid
sumber
6
Ini akan lebih tepat jika aktivitas kedua adalah pengaturan perubahan / pengaturan permanen dalam aplikasi.
elimirks
Apakah ini akan berfungsi jika saya ingin berbagi data antara 2 aplikasi Android yang berbeda? Satu disebut perpustakaan?
joey rohan
21
Ini adalah penyalahgunaan SharedPreferences.
Eran Goldin
1
Menggunakan metode ini untuk hanya meneruskan data antara dua aktivitas (pertanyaan awal OP) seperti menyalahgunakan SharedPreferences. Ini tidak dimaksudkan untuk ini dan sistem harus melakukan terlalu banyak pekerjaan (menulis xml pada penyimpanan dan membacanya lagi) untuk tugas sederhana seperti meneruskan data antara dua kegiatan.
Sudara