Enquanto @yydl fornece uma razão convincente para o newInstance
melhor método:
Se o Android decidir recriar o seu Fragmento mais tarde, chamará o construtor sem argumentos do seu fragmento. Portanto, sobrecarregar o construtor não é uma solução.
ainda é possível usar um construtor . Para entender por que isso ocorre, primeiro precisamos ver por que a solução alternativa acima é usada pelo Android.
Antes que um fragmento possa ser usado, é necessária uma instância. O Android chama YourFragment()
(o construtor sem argumentos ) para construir uma instância do fragmento. Aqui, qualquer construtor sobrecarregado que você escreve será ignorado, pois o Android não pode saber qual usar.
Durante a vida útil de uma atividade, o fragmento é criado como descrito acima e destruído várias vezes pelo Android. Isso significa que se você colocar dados no próprio objeto de fragmento, eles serão perdidos quando o fragmento for destruído.
Para contornar o problema, o Android solicita que você armazene dados usando uma Bundle
(chamada setArguments()
), que pode ser acessada a partir de YourFragment
. Os argumentos bundle
são protegidos pelo Android e, portanto, garantem a persistência .
Uma maneira de configurar esse pacote configurável é usando um 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;
}
No entanto, um construtor:
public YourFragment(int data) {
Bundle args = new Bundle();
args.putInt("data", data);
setArguments(args);
}
pode fazer exatamente a mesma coisa que o newInstance
método
Naturalmente, isso falharia e é um dos motivos pelos quais o Android quer que você use o newInstance
método:
public YourFragment(int data) {
this.data = data; // Don't do this
}
Como explicação adicional, aqui está a Classe de Fragmentos do 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;
}
Observe que o Android pede que os argumentos sejam definidos apenas na construção e garante que eles serão mantidos.
EDIT : Como apontado nos comentários de @JHH, se você estiver fornecendo um construtor personalizado que requer alguns argumentos, o Java não fornecerá ao seu fragmento um construtor padrão sem argumento . Portanto, isso exigiria que você definisse um construtor no arg , que é um código que você poderia evitar com o newInstance
método factory.
EDIT : Android não permite mais usar um construtor sobrecarregado para fragmentos. Você deve usar o newInstance
método