@Yydl, newInstance
yöntemin neden daha iyi olduğuna dair zorlayıcı bir neden verirken :
Android, Parçanızı daha sonra yeniden oluşturmaya karar verirse, parçanızın bağımsız değişken yapıcısını çağırır. Yani kurucuyu aşırı yüklemek bir çözüm değildir.
bir kurucu kullanmak hala mümkün . Bunun nedenini görmek için, öncelikle yukarıdaki geçici çözümün Android tarafından neden kullanıldığını görmemiz gerekir.
Bir parçanın kullanılabilmesi için önce bir örneğe ihtiyaç vardır. Parçanın bir örneğini oluşturmak için Android çağrıları YourFragment()
( argüman oluşturucu yok ). Android, hangisini kullanacağını bilemediğinden, yazdığınız aşırı yüklenmiş kurucu yok sayılır.
Bir Faaliyetin ömrü boyunca, parça yukarıdaki gibi oluşturulur ve Android tarafından birçok kez imha edilir. Bu, parça nesnesinin kendisine veri koyarsanız, parça yok edildiğinde verilerin kaybolacağı anlamına gelir.
Geçici çözüm olarak, android daha sonra erişilebilen bir Bundle
(çağrı setArguments()
) kullanarak veri depolamanızı ister YourFragment
. Bağımsız değişkenler bundle
Android tarafından korunur ve bu nedenle kalıcı olması garanti edilir .
Bu paketi ayarlamanın bir yolu statik bir newInstance
yöntem kullanmaktır:
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;
}
Ancak bir kurucu:
public YourFragment(int data) {
Bundle args = new Bundle();
args.putInt("data", data);
setArguments(args);
}
newInstance
yöntemle tam olarak aynı şeyi yapabilir .
Doğal olarak, bu başarısız olur ve Android'in newInstance
yöntemi kullanmanızı istemesinin nedenlerinden biridir :
public YourFragment(int data) {
this.data = data; // Don't do this
}
Daha fazla açıklama olarak, Android'in Fragment Sınıfı:
/**
* 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;
}
Android'in, argümanların yalnızca yapım aşamasında ayarlanmasını istediğini ve bunların saklanacağını garanti ettiğini unutmayın.
DÜZENLEME : @JHH tarafından yapılan açıklamalarda belirtildiği gibi, bazı bağımsız değişkenler gerektiren özel bir yapıcı sağlıyorsanız, Java parçanıza arg varsayılan yapıcısı sağlamaz . Bu nedenle, bir arg yapıcısı tanımlamanız gerekir , bu da newInstance
fabrika yöntemiyle kaçınabileceğiniz koddur .
EDIT : Android artık fragmanlar için aşırı yüklenmiş bir kurucu kullanılmasına izin vermiyor. newInstance
Yöntemi kullanmalısınız .