Terkadang pengguna perlu menampilkan prompt ketika data yang diperlukan hilang. Misalnya, daftar kosong, kesalahan server, atau tidak ada koneksi Internet. Apa yang harus dilakukan jika petunjuk harus rumit dan berbeda untuk setiap kasus? Penerapan di bawah ini harus mengatasi masalah ini.
Intinya adalah bahwa tugas untuk menampilkan informasi tambahan diberikan ke objek terpisah. Ini memberikan pemisahan logika yang lebih tepat dan lebih sedikit kode dalam aktivitas. Mari lanjutkan ke deskripsi implementasi yang lebih rinci.
Setiap petunjuk adalah fragmen terpisah yang bisa berisi apa saja. Untuk mengelolanya, objek memerlukan FragmentManager dan Id container tempat fragmen harus berada. Tidak ada lagi ketergantungan.
Setiap situasi adalah elemen enumerasi (semuanya akan menjadi sangat jelas dengan kode) yang bersarang di objek ini. Ketika petunjuk perlu diubah, metode yang bertanggung jawab untuk penggantian akan dipanggil, ke mana situasi baru akan diteruskan. Ini semua logika.
Sekarang ini harus dilakukan dalam realitas Android. Kecuali untuk aktivitas (atau fragmen) itu sendiri, yang membutuhkan sebuah objek, tidak ada orang lain yang akan merujuknya. Ada awal, status "Default". Ini akan ditampilkan pertama kali muncul, sampai nilai baru muncul. Nilainya sendiri disimpan di LiveData (yang ada di ViewModel), tempat aktivitas berlangganan dan meneruskan setiap nilai baru ke objek. Ini memungkinkan Anda mengalami penciptaan kembali aktivitas dan mempertahankan status.
Saya memutuskan untuk menggunakan kode status HTTP sebagai contoh, tetapi apa pun dapat digunakan. Misalnya, saat menanyakan database film dengan ketentuan tentang tanggal rilis, sutradara, aktor, dll. petunjuk berbeda mungkin ditampilkan: tidak ada aktor yang diwajibkan, tidak ada film pada tanggal ini, sutradara ini tidak memiliki film seperti itu, dll.
Nuansa
Jika, misalnya, Anda tidak menghapus daftar data, petunjuk mungkin ditampilkan di atas (atau di bawah) daftar ini, yang akan jelek. Untuk melakukan ini, Anda harus terlebih dahulu menghapus daftar (atau menyembunyikan visibilitasnya, mana yang lebih baik?).
Penerapan
CodeSwitcher.
CodeSwitcher. Saya tidak bisa menemukan nama yang memadai.
//
public class CodeSwitcher {
//
public enum Code {
DEFAULT,
HTTP_OK,
HTTP_CREATED,
HTTP_BAD_REQUEST,
HTTP_NOT_FOUND,
NO_DATA
}
//
private FragmentManager fragmentManager;
private int fragmentHostId;
public CodeSwitcher(FragmentManager fragmentManager, int fragmentHostId) {
this.fragmentManager = fragmentManager;
this.fragmentHostId = fragmentHostId;
}
//,
public void switchFragments(Code code) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
switch (code) {
case HTTP_OK:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_OK"));
break;
case HTTP_CREATED:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_CREATED"));
break;
case HTTP_BAD_REQUEST:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_BAD_REQUEST"));
break;
case HTTP_NOT_FOUND:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_NOT_FOUND"));
break;
case NO_DATA:
transaction.replace(fragmentHostId, CodeFragment.newInstance("NO_DATA"));
break;
default:
transaction.replace(fragmentHostId, CodeFragment.newInstance("Default"));
break;
}
transaction.commit();
}
}
// ViewModel
//
public CodeShowActivityViewModel() {
listCode = new MutableLiveData<>();
listCode.setValue(CodeSwitcher.Code.DEFAULT);
}
// , ,
public void httpOk() {
listCode.setValue(CodeSwitcher.Code.HTTP_OK);
clearList();
}
public void httpBadRequest() {
listCode.setValue(CodeSwitcher.Code.HTTP_BAD_REQUEST);
clearList();
}
// ,
private CodeSwitcher switcher;
// onCreate()
switcher = new CodeSwitcher(getSupportFragmentManager(), R.id._);
// LiveData,
codeActVM.getListCode().observe(this, code -> {
switcher.switchFragments(code);
});
GIF (4MB) dengan deskripsi
Sejak awal, sebuah keadaan default muncul, itu secara khusus ditampilkan di latar belakang, tetapi kenyataannya itu harus kosong. Kemudian penerimaan berbagai kode dan tampilannya ditiru. Di bagian akhir, ditunjukkan bahwa status tetap ada bahkan saat aktivitas dibuat ulang.
Apa pendapat Anda tentang metode ini?
PS
Masalah dengan nama ...