Estou criando um aplicativo com Fragments
e em um deles, criei um construtor não padrão e recebi este aviso:
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead
Alguém pode me dizer por que isso não é uma boa ideia?
Você também pode sugerir como eu faria isso:
public static class MenuFragment extends ListFragment {
public ListView listView1;
Categories category;
//this is my "non-default" constructor
public MenuFragment(Categories category){
this.category = category;
}....
Sem usar o construtor não padrão?
android
android-fragments
BlackHatSamurai
fonte
fonte
Respostas:
Crie um objeto de pacote configurável e insira seus dados (neste exemplo, seu
Category
objeto). Cuidado, você não pode passar esse objeto diretamente no pacote, a menos que seja serializável. Eu acho que é melhor criar seu objeto no fragmento e colocar apenas um ID ou outra coisa no pacote. Este é o código para criar e anexar um pacote configurável:Depois disso, no seu fragmento, acesse os dados:
Isso é tudo.
fonte
Parcelable
objetos. Além disso, você não deve passar aContext
, porque essas informações podem ser acessadas através dogetActivity()
método do fragmento .Type value = getArguments().getType("key");
?newInstance()
método. Por exemplo:public static FragmentName newInstance(your variables){}
. Como a documentação do Android recomenda, não faça um construtor com parâmetros, porque o padrão (sem parâmetros) será chamado automaticamente após o reinício do seu fragmento.Parece que nenhuma das respostas realmente responde "por que usar bundle para passar parâmetros em vez de construtores não padrão"
A razão pela qual você deve passar os parâmetros através do pacote é que, quando o sistema restaura um
fragment
(por exemplo, na alteração da configuração), ele restaura automaticamente o seubundle
.Os retornos de chamada gostam
onCreate
ouonCreateView
devem ler os parâmetros dobundle
- desta forma, você garante que restaura o estado dofragment
corretamente para o mesmo estado em quefragment
foi inicializado (observe que esse estado pode ser diferente doonSaveInstanceState bundle
que é passado para oonCreate/onCreateView
)A recomendação de usar o
newInstance()
método estático é apenas uma recomendação. Você pode usar um construtor não padrão, mas certifique-se de preencher os parâmetros de inicialização nobundle
interior do corpo desse construtor. E leia esses parâmetros nos métodosonCreate()
ouonCreateView()
.fonte
Você
Fragment
não deve ter construtores por causa de como aFragmentManager
instancia. Você deve ter umnewInstance()
método estático definido com os parâmetros necessários, agrupe-os e defina-os como os argumentos do fragmento, que você poderá acessar posteriormente com oBundle
parâmetroPor exemplo:
E leia estes argumentos em
onCreate
:Dessa forma, se desanexado e reconectado, o estado do objeto pode ser armazenado através dos argumentos, assim como
bundles
anexado aIntent
s.fonte
Se você usar o parâmetro para alguma classe. tente isso
fonte
FragmentManager
, você perderá mSomeInstance.Eu acho que não há diferença entre construtor estático e dois construtores (um vazio e parametrizado que armazena argumentos no pacote de argumentos de um fragmento); provavelmente, essa regra é criada para reduzir a probabilidade de esquecer de implementar o construtor não-arg em Java , que não é gerado implicitamente quando a sobrecarga está presente.
Nos meus projetos, uso o Kotlin e implemento fragmentos com um construtor primário no-arg e um construtor secundário para argumentos que apenas os armazenam em um pacote configurável e os definem como argumentos de Fragmento, tudo funciona bem.
fonte
Se o fragmento usar construtores não padrão após a alteração da configuração, o fragmento perderá todos os dados.
fonte