Mientras que @yydl da una razón convincente sobre por qué el newInstance
método es mejor:
Si Android decide recrear su Fragmento más tarde, llamará al constructor sin argumentos de su fragmento. Por lo tanto, sobrecargar el constructor no es una solución.
Todavía es bastante posible utilizar un constructor . Para ver por qué esto es así, primero debemos ver por qué Android usa la solución anterior.
Antes de que se pueda usar un fragmento, se necesita una instancia. Android llama YourFragment()
(el constructor sin argumentos ) para construir una instancia del fragmento. Aquí se ignorará cualquier constructor sobrecargado que escriba, ya que Android no puede saber cuál usar.
Durante la vida útil de una Actividad, el fragmento se crea como se describe arriba y Android lo destruye varias veces. Esto significa que si coloca datos en el propio objeto de fragmento, se perderá una vez que se destruya el fragmento.
Para solucionarlo, Android le pide que almacene datos utilizando un Bundle
(llamada setArguments()
), al que luego se puede acceder desde YourFragment
. Los argumentos bundle
están protegidos por Android y, por lo tanto, se garantiza que sean persistentes .
Una forma de configurar este paquete es mediante el uso de un newInstance
método estático :
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;
}
Sin embargo, un constructor:
public YourFragment(int data) {
Bundle args = new Bundle();
args.putInt("data", data);
setArguments(args);
}
puede hacer exactamente lo mismo que el newInstance
método.
Naturalmente, esto fallaría, y es una de las razones por las que Android quiere que uses el newInstance
método:
public YourFragment(int data) {
this.data = data; // Don't do this
}
Como explicación adicional, aquí está la Clase de Fragmento de 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;
}
Tenga en cuenta que Android solicita que los argumentos se establezcan solo en la construcción y garantiza que se retendrán.
EDITAR : Como se señaló en los comentarios de @JHH, si proporciona un constructor personalizado que requiere algunos argumentos, Java no proporcionará a su fragmento un constructor predeterminado sin argumentos . Por lo tanto, esto requeriría que defina un constructor sin argumentos , que es un código que podría evitar con el newInstance
método de fábrica.
EDITAR : Android ya no permite usar un constructor sobrecargado para fragmentos. Debes usar el newInstance
método.