Bagaimana cara menggunakan contoh onSavedInstanceState

110

Saya bingung ketika harus menyelamatkan negara. Jadi saya tahu yang onSaveInstanceState(Bundle)dipanggil saat aktivitas akan segera dimusnahkan. Tetapi bagaimana Anda menyimpan informasi Anda di dalamnya dan mengembalikannya ke keadaan semula onCreate(Bundle savedInstanceState)? Saya tidak mengerti bagaimana bundel ini akan memulihkan informasi. Akan sangat membantu jika seseorang dapat memberikan contoh. Panduan Dev tidak menjelaskan hal ini dengan baik.

public class Conversation extends Activity {
    private ProgressDialog progDialog;
    int typeBar;
    TextView text1;
    EditText edit;
    Button respond;
    private String name;
    private String textAtView;
    private String savedName;

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        setContentView(R.layout.dorothydialog);
        text1 = (TextView)findViewById(R.id.dialog);
        edit = (EditText)findViewById(R.id.repsond);
        respond = (Button)findViewById(R.id.button01);

        if(savedInstanceState != null){
            savedInstanceState.get(savedName);
            text1.setText(savedName);
        }
        else{
            text1.setText("Hello! What is your name?");
            respond.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    name = edit.getText().toString();
                    text1.setText("Nice to meet you "+ name);
                }   
            });
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
        outState.putString(savedName, name);
    }
}
tj walker
sumber
text1.setText (storedInstanceState.getString (storedName));
Spidy
@Spidy Bagaimana dengan onBackpressed? Bagaimana saya bereaksi terhadap ini dengan bundel?
tj walker
Anda tidak akan. Saat pengguna menekan tombol kembali. Aktivitas tersebut terbunuh. Gunakan database untuk penyimpanan data permanen. Gunakan Bundle untuk mengembalikan aplikasi yang telah dimulai ulang ke keadaan sebelumnya.
Spidy

Jawaban:

198

Ini Bundleadalah wadah untuk semua informasi yang ingin Anda simpan. Anda menggunakan fungsi put * untuk memasukkan data ke dalamnya. Berikut adalah daftar singkat (masih ada lagi) fungsi put yang dapat Anda gunakan untuk menyimpan data di Bundle.

putString
putBoolean
putByte
putChar
putFloat
putLong
putShort
putParcelable (used for objects but they must implement Parcelable)

Dalam onCreatefungsi Anda , ini Bundledikembalikan ke program. Cara terbaik untuk memeriksa apakah aplikasi sedang dimuat ulang, atau dimulai untuk pertama kali adalah:

if (savedInstanceState != null) {
    // Then the application is being reloaded
}

Untuk mendapatkan data kembali, gunakan fungsi get * seperti fungsi put *. Data disimpan sebagai pasangan nama-nilai. Ini seperti peta hash. Anda memberikan kunci dan nilainya, lalu ketika Anda menginginkan nilainya kembali, Anda memberikan kunci dan fungsi tersebut mendapatkan nilainya. Berikut contoh singkatnya.

@Override
public void onSaveInstanceState(Bundle outState) {
   outState.putString("message", "This is my message to be reloaded");
   super.onSaveInstanceState(outState);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        String message = savedInstanceState.getString("message");
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
}

Pesan Anda yang disimpan akan dipanggang ke layar. Semoga ini membantu.

Rapi
sumber
14
onSaveInstanceState () dipanggil sebelum aktivitas Anda dijeda. Jadi setiap info yang diperlukan setelah berpotensi hancur dapat diambil dari Bundel yang disimpan
Diederik
@Spidy Luar Biasa! Anda baru saja membuat saya memahami segalanya tentang bundel! jadi im menebak outState akan diteruskan kembali ke bundel storedInstanceState? Benar?
tj walker
Ya. Bundel outState diteruskan kembali sebagai simpananInstanceState Bundle
Spidy
1
@tj walker - Sumber bagus lainnya adalah buku referensi teknis. Pro Android 3 adalah sumber daya yang murah tetapi luas yang bisa Anda dapatkan di Amazon
Spidy
@Spidy Saya memposting kode aktivitas saya di atas untuk Anda lihat. Mungkin Anda bisa memberi tahu saya jika saya menyelamatkan negara bagian saya, seperti yang Anda sarankan.
tj walker
34

Satu catatan utama yang harus diketahui oleh semua pengembang Android baru adalah bahwa informasi apa pun dalam Widget (TextView, Buttons, dll.) Akan disimpan secara otomatis oleh Android selama Anda menetapkan ID untuk mereka. Artinya, sebagian besar status UI ditangani tanpa masalah. Hanya ketika Anda perlu menyimpan data lain hal ini menjadi masalah.

Dari Android Docs :

Satu-satunya pekerjaan yang Anda perlukan adalah memberikan ID unik (dengan atribut android: id) untuk setiap widget yang ingin Anda simpan statusnya. Jika widget tidak memiliki ID, maka itu tidak dapat menyimpan statusnya

Keith Adler
sumber
1
Benarkah itu? Karena saya memiliki aktivitas dengan textview tombol dan edit teks. Jika aplikasi dihancurkan atau dimatikan semuanya akan dikembalikan ke keadaan semula. Dalam aplikasi saya teks textView berubah setiap kali pengguna mengklik tombol.
tj walker
Apakah dokumentasinya tidak akurat? Saya tidak pernah memiliki View yang menyimpan informasinya sendiri. Taruhan terbaik Anda adalah menyimpan semua informasi Anda sendiri menurut pendapat saya.
Spidy
2
Jika tujuan Anda adalah menyimpan informasi diSaveInstanceState BUKAN tempat untuk melakukannya. Itu karena tidak ada jaminan bahwa itu akan dipanggil (lihat dokumen). Sebaiknya Anda menulis ke database, SharedPreferences, dll. Ya, informasi ini akurat. Cara terbaik untuk menguji apakah UI Anda tetap ada dengan cara ini adalah dengan memutar tampilan Anda saat orientasi berubah menjalankan ulang onCreate Anda dan menggunakan paket untuk memulihkan status.
Keith Adler
@Nissan Fan dapatkah anda memberikan contoh seperti yang spidy lakukan diatas? Dengan sharedprefs dan semuanya? Terima kasih
tj walker
Contoh terbaik sejujurnya datang dari dokumentasi. developer.android.com/guide/topics/data/data-storage.html#pref
Keith Adler
6

Informasi yang bagus: Anda tidak perlu memeriksa apakah objek Bundle null ke dalam metode onCreate (). Gunakan metode onRestoreInstanceState (), yang dipanggil sistem setelah metode onStart (). Sistem memanggil onRestoreInstanceState () hanya jika ada status tersimpan untuk dipulihkan, jadi Anda tidak perlu memeriksa apakah Bundle bernilai null

Diego Souza
sumber
5

Informasi toko:

static final String PLAYER_SCORE = "playerScore";
static final String PLAYER_LEVEL = "playerLevel";

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(PLAYER_SCORE, mCurrentScore);
    savedInstanceState.putInt(PLAYER_LEVEL, mCurrentLevel);

// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}

Jika Anda tidak ingin memulihkan informasi di onCreate-Method:

Berikut adalah contohnya: Menciptakan kembali Aktivitas

Daripada memulihkan status selama onCreate (), Anda dapat memilih untuk mengimplementasikan onRestoreInstanceState (), yang dipanggil sistem setelah metode onStart (). Sistem memanggil onRestoreInstanceState () hanya jika ada status tersimpan untuk dipulihkan, jadi Anda tidak perlu memeriksa apakah Bundle bernilai null

public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);

// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(PLAYER_SCORE);
mCurrentLevel = savedInstanceState.getInt(PLAYER_LEVEL);
}
Klatschen
sumber
0

Pada dasarnya onSaveInstanceState (Bundle outBundle) akan memberi Anda sebuah bundel. Saat Anda melihat kelas Bundle, Anda akan melihat bahwa Anda dapat memasukkan banyak barang berbeda di dalamnya. Pada panggilan onCreate () berikutnya, Anda baru saja mendapatkan Bundle itu kembali sebagai argumen. Kemudian Anda dapat membaca nilai Anda lagi dan memulihkan aktivitas Anda.

Katakanlah Anda memiliki aktivitas dengan EditText. Pengguna menulis beberapa teks di dalamnya. Setelah itu sistem akan memanggil onSaveInstanceState () Anda. Anda membaca teks dari EditText dan menuliskannya ke dalam Bundle melalui Bundle.putString ("edit_text_value", theValue).

Sekarang onCreate dipanggil. Anda memeriksa apakah bundel yang diberikan tidak null. Jika demikian, Anda dapat memulihkan nilai melalui Bundle.getString ("edit_text_value") dan mengembalikannya ke EditText Anda.


sumber
0

Ini untuk informasi tambahan.

Bayangkan skenario ini

  1. ActivityA meluncurkan ActivityB.
  2. ActivityB meluncurkan ActivityAPrime baru oleh

    Intent intent = new Intent(getApplicationContext(), ActivityA.class);
    startActivity(intent);
  3. ActivityAPrime tidak memiliki hubungan dengan ActivityA.
    Dalam hal ini Bundle di ActivityAPrime.onCreate () akan menjadi null.

Jika ActivityA dan ActivityAPrime harus merupakan aktivitas yang sama dan bukan aktivitas berbeda, ActivityB harus memanggil finish () daripada menggunakan startActivity ().

ken
sumber
hanya untuk memperjelas, dalam contoh Anda, apakah ActivityA == ActivityA instance 1 dan ActivityAPrime == ActivityA instance 2? juga, saat Anda mengatakan, "ActivityB harus memanggil finish () daripada menggunakan startActivity ()." maksud Anda: (1) AcitivityB harus memanggil finish () dan kemudian menggunakan startActivity () setelahnya (2) atau ActivityB harus memanggil finish () daripada menggunakan startActivity () sama sekali? jika yang Anda maksud adalah opsi 2, bagaimana Anda menyarankan seseorang untuk memulai ulang aktivitas yang sama instance1 sehingga Anda dapat memuat data yang berisi aktivitas sebelum dimusnahkan / selesai? Terima kasih
cjayem13
ActivityA dan ActivityAPrime memiliki kelas yang sama tetapi instance yang berbeda. Dalam skenario ini, ActivityA belum menyelesaikan usahanya, di tengah-tengahnya ActivityA membuat dan memulai ActivityB, jadi ketika ActivityB selesai, ActivityA harus melanjutkan sisa bisnisnya. Dalam kasus ini, salah memanggil startActivity, dan mengharapkan ActivityA dan ActiviyAPrime sebagai instance yang sama. jadi kita tidak boleh memulai kembali ActivityA, cukup selesaikan ActivityB dan biarkan ActivityA melanjutkan operasinya ...
ken
0

Jika Data Tidak Dimuat Dari savedInstanceStategunakan kode berikut.
Masalahnya adalah panggilan url tidak sepenuhnya selesai jadi, periksa apakah data dimuat kemudian untuk menampilkan nilai instanceState.

//suppose data is not Loaded to savedInstanceState at 1st swipe
if (savedInstanceState == null && !mAlreadyLoaded){
    mAlreadyLoaded = true;
    GetStoryData();//Url Call
} else {
    if (listArray != null) {  //Data Array From JsonArray(ListArray)
        System.out.println("LocalData  " + listArray);
        view.findViewById(R.id.progressBar).setVisibility(View.GONE);
    }else{
        GetStoryData();//Url Call
    }
}
Mathan Chinna
sumber