Sementara @yydl memberikan alasan kuat mengapa newInstance
metode ini lebih baik:
Jika Android memutuskan untuk membuat ulang Fragmen Anda nanti, itu akan memanggil konstruktor no-argumen fragmen Anda. Jadi kelebihan konstruktor bukanlah solusi.
masih sangat mungkin menggunakan konstruktor . Untuk melihat mengapa ini, pertama-tama kita perlu melihat mengapa solusi di atas digunakan oleh Android.
Sebelum sebuah fragmen dapat digunakan, sebuah instance dibutuhkan. Android memanggil YourFragment()
( konstruktor tanpa argumen ) untuk membuat instance fragmen. Di sini konstruktor kelebihan beban apa pun yang Anda tulis akan diabaikan, karena Android tidak dapat mengetahui mana yang akan digunakan.
Dalam masa Aktivitas, fragmen dibuat seperti di atas dan dihancurkan beberapa kali oleh Android. Ini berarti bahwa jika Anda menempatkan data dalam objek fragmen itu sendiri, itu akan hilang setelah fragmen dihancurkan.
Untuk mengatasinya, android meminta Anda menyimpan data menggunakan Bundle
(panggilan setArguments()
), yang kemudian dapat diakses dari YourFragment
. Argumen bundle
dilindungi oleh Android, dan karenanya dijamin akan tetap ada .
Salah satu cara untuk mengatur bundel ini adalah dengan menggunakan newInstance
metode statis :
public static YourFragment newInstance (int data) {
YourFragment yf = new YourFragment()
/* See this code gets executed immediately on your object construction */
Bundle args = new Bundle();
args.putInt("data", data);
yf.setArguments(args);
return yf;
}
Namun, seorang konstruktor:
public YourFragment(int data) {
Bundle args = new Bundle();
args.putInt("data", data);
setArguments(args);
}
dapat melakukan hal yang persis sama dengan newInstance
metode.
Secara alami, ini akan gagal, dan merupakan salah satu alasan Android ingin Anda menggunakan newInstance
metode ini:
public YourFragment(int data) {
this.data = data; // Don't do this
}
Sebagai penjelasan lebih lanjut, inilah Kelas Fragmen Android:
/**
* Supply the construction arguments for this fragment. This can only
* be called before the fragment has been attached to its activity; that
* is, you should call it immediately after constructing the fragment. The
* arguments supplied here will be retained across fragment destroy and
* creation.
*/
public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
}
Perhatikan bahwa Android meminta agar argumen ditetapkan hanya pada konstruksi, dan menjamin bahwa ini akan dipertahankan.
EDIT : Seperti yang ditunjukkan dalam komentar oleh @JHH, jika Anda menyediakan konstruktor khusus yang memerlukan beberapa argumen, maka Java tidak akan memberikan fragmen Anda dengan konstruktor default no arg . Jadi ini akan mengharuskan Anda untuk mendefinisikan konstruktor no arg , yang merupakan kode yang dapat Anda hindari dengan newInstance
metode pabrik.
EDIT : Android tidak lagi mengizinkan konstruktor yang kelebihan beban untuk fragmen. Anda harus menggunakan newInstance
metode ini.