Cara meneruskan nilai dari satu aktivitas ke aktivitas sebelumnya

97

Bagaimana cara meneruskan nilai dari satu layar ke layar sebelumnya?

Pertimbangkan kasus ini: Saya memiliki dua aktivitas. Layar pertama memiliki satu TextViewtombol dan aktivitas kedua memiliki satu EditTexttombol.

Jika saya klik tombol pertama maka harus pindah ke aktivitas kedua dan di sini pengguna harus mengetikkan sesuatu di kotak teks. Jika dia menekan tombol dari layar kedua maka nilai dari kotak teks akan berpindah ke aktivitas pertama dan itu harus ditampilkan di aktivitas pertama TextView.

Kumar
sumber

Jawaban:

241

Untuk menangkap tindakan yang dilakukan pada satu Aktivitas di dalam lainnya membutuhkan tiga langkah.

Luncurkan Aktivitas sekunder (Aktivitas 'Edit Teks' Anda) sebagai subaktivitas dengan menggunakan startActivityForResultdari Aktivitas utama Anda.

Intent i = new Intent(this,TextEntryActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

Dalam subaktivitas, daripada hanya menutup Aktivitas saat pengguna mengklik tombol, Anda perlu membuat Intent baru dan menyertakan nilai teks yang dimasukkan ke dalam paket ekstra. Untuk meneruskannya kembali ke panggilan induk setResultsebelum memanggil finishuntuk menutup Aktivitas sekunder.

Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

Langkah terakhir adalah memanggil Activity: Override onActivityResultuntuk mendengarkan callback dari Activity entri teks. Dapatkan ekstra dari Intent yang dikembalikan untuk mendapatkan nilai teks yang harus Anda tampilkan.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
    case (STATIC_INTEGER_VALUE) : { 
      if (resultCode == Activity.RESULT_OK) { 
      String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
      // TODO Update your TextView.
      } 
      break; 
    } 
  } 
} 
Reto Meier
sumber
27
Ini semua berhasil bagi saya kecuali new Intent(null);"terlalu ambigu" dan saya harus mengubahnya menjadi new Intent();.
Richard Tingle
1
Perlu juga dicatat bahwa ini hanya akan bekerja dalam konteks yang sama. Misalnya, jika Anda memulai aktivitas dari fragmen, ini tidak akan berfungsi karena requestCode akan berbeda setiap saat. Anda harus menggunakan getActivity (). StartActivityForResult () dalam fragmen.
Stef
10

Ada beberapa cara untuk mengakses variabel atau objek di kelas atau Aktivitas lain.

A. Basis Data

B. preferensi bersama.

C. Serialisasi objek.

D. Sebuah kelas yang dapat menampung data umum dapat disebut sebagai Common Utilities itu tergantung pada Anda.

E. Meneruskan data melalui Intents dan Parcelable Interface.

Itu tergantung pada kebutuhan proyek Anda.

A. Basis Data

SQLite adalah Open Source Database yang tertanam di Android. SQLite mendukung fitur database relasional standar seperti sintaks SQL, transaksi, dan pernyataan yang disiapkan.

Tutorial - http://www.vogella.com/articles/AndroidSQLite/article.html

B. Preferensi Bersama

Misalkan Anda ingin menyimpan username. Jadi sekarang akan ada dua hal yang Key Username, Value Value.

Bagaimana cara menyimpan

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

Dengan menggunakan putString (), putBoolean (), putInt (), putFloat (), putLong () Anda dapat menyimpan dtatype yang Anda inginkan.

Bagaimana cara mengambil

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

C. Serialisasi Objek

Serlisasi objek digunakan jika kita ingin menyimpan status objek untuk dikirim melalui jaringan atau Anda juga dapat menggunakannya untuk tujuan Anda.

Gunakan kacang java dan simpan di dalamnya sebagai salah satu ladangnya dan gunakan getter dan setter untuk itu

JavaBeans adalah kelas Java yang memiliki properti. Pikirkan properti sebagai variabel instance pribadi. Karena bersifat pribadi, satu-satunya cara agar dapat diakses dari luar kelas adalah melalui metode di kelas. Metode yang mengubah nilai properti disebut metode penyetel, dan metode yang mengambil nilai properti disebut metode pengambil.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

Tetapkan variabel di metode email Anda dengan menggunakan

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

Kemudian gunakan serialisasi objek untuk membuat serial objek ini dan di kelas Anda yang lain deserialisasi objek ini.

Dalam serialisasi, suatu objek dapat direpresentasikan sebagai urutan byte yang mencakup data objek serta informasi tentang tipe objek dan tipe data yang disimpan dalam objek.

Setelah objek berseri telah ditulis ke dalam file, itu dapat dibaca dari file dan deserialisasi yaitu, informasi jenis dan byte yang mewakili objek dan datanya dapat digunakan untuk membuat ulang objek dalam memori.

Jika Anda menginginkan tutorial untuk ini, lihat tautan ini

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

Dapatkan variabel di kelas lain

D. CommonUtilities

Anda dapat membuat kelas sendiri yang dapat berisi data umum yang sering Anda perlukan dalam proyek Anda.

Sampel

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Meneruskan Data melalui Maksud

Silakan lihat tutorial ini untuk opsi melewatkan data ini.

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/

Nikhil Agrawal
sumber
6

kamu tidak harus ...

Panggil saja newIntent () dari aktivitas kedua

Intent retData=new Intent();

Tambahkan data untuk dikirimkan kembali

putExtras (retData.putExtra("userName", getUsrName()));

Lanjutkan dengan setResult

setResult(RESULT_OK, retData);

Dan kemudian bisa selesai

finish();
Sora
sumber
2

Saya sering menggunakan variabel statis dalam aktivitas pemanggilan dengan metode penyetel statis untuk menyetelnya.

Dengan cara ini saya dapat mengubah nilai dalam aktivitas apa pun sesuka hati, terlepas dari aliran kontrol yang tepat antara berbagai aktivitas.

Perhatikan bahwa trik ini hanya dapat digunakan jika Anda tidak peduli dengan instantiasi lebih dari satu salinan aktivitas (kelas) yang sama dalam aplikasi, namun menurut saya ini yang paling mudah untuk diterapkan, dan saya paling sering menggunakannya .

Ohad Aloni
sumber
Bukan solusi yang bagus. Ini bertentangan dengan praktik terbaik Android. Anda tidak dapat menjamin suatu aktivitas tidak akan dimatikan dan sebuah instance baru dimulai oleh sistem.
SIr Codealot
0

Cara terbaik untuk melakukannya di sini adalah dengan meletakkan variabel ke kelas umum yang didefinisikan di luar ruang lingkup

public class Utils 
{
    public static String mPosition;
}

di dalam kode Anda (mis. OnButtonClick dll ...)

Intent intent = new Intent(Intent.ACTION_PICK, 
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);

di dalam kode

@Override public void onActivityResult (int requestCode, int resultCode, Intent data) {if (requestCode == Keys.PICK_CONTACT) {if (resultCode == Activity.RESULT_OK) {Uri contactData = data.getData ();

            //you may use the variable here after intent result
            LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....
Alp Altunel
sumber