Estoy creando una aplicación con Fragments
y en uno de ellos, creé un constructor no predeterminado y recibí esta advertencia:
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead
¿Alguien puede decirme por qué no es una buena idea?
¿Me puede sugerir también cómo podría lograr esto?
public static class MenuFragment extends ListFragment {
public ListView listView1;
Categories category;
//this is my "non-default" constructor
public MenuFragment(Categories category){
this.category = category;
}....
¿Sin usar el constructor no predeterminado?
android
android-fragments
BlackHatSamurai
fuente
fuente
Respuestas:
Cree un objeto de paquete e inserte sus datos (en este ejemplo, su
Category
objeto). Tenga cuidado, no puede pasar este objeto directamente al paquete, a menos que sea serializable. Creo que es mejor construir su objeto en el fragmento y poner solo una identificación u otra cosa en el paquete. Este es el código para crear y adjuntar un paquete:Después de eso, en su fragmento de datos de acceso:
Eso es todo.
fuente
Parcelable
objetos. Además, no debe pasar unContext
, porque se puede acceder a esa información a través delgetActivity()
método del fragmento .Type value = getArguments().getType("key");
?newInstance()
método. Por ejemplo:public static FragmentName newInstance(your variables){}
. Como recomienda la documentación de Android, no cree un constructor con parámetros, porque el predeterminado (sin parámetros) se llamará automáticamente después del reinicio de su fragmento.Parece que ninguna de las respuestas responde realmente "¿por qué usar paquete para pasar parámetros en lugar de constructores no predeterminados"
La razón por la que debería pasar los parámetros a través del paquete es porque cuando el sistema restaura un
fragment
(por ejemplo, en el cambio de configuración), restaurará automáticamente subundle
.Las devoluciones de llamada tienen gusto
onCreate
oonCreateView
deberían leer los parámetros delbundle
- de esta manera se garantiza que restaurará el estado delfragment
correcto al mismo estado con el quefragment
se inicializó (tenga en cuenta que este estado puede ser diferente delonSaveInstanceState bundle
que se pasa alonCreate/onCreateView
)La recomendación de usar el
newInstance()
método estático es solo una recomendación. Puede usar un constructor no predeterminado, pero asegúrese de completar los parámetros de inicialización en elbundle
interior del cuerpo de ese constructor. Y lea esos parámetros en los métodosonCreate()
oonCreateView()
.fuente
No
Fragment
deberías tener constructores debido a cómo loFragmentManager
instancia. Debe tener unnewInstance()
método estático definido con los parámetros que necesita, luego agruparlos y establecerlos como argumentos del fragmento, a los que luego puede acceder con elBundle
parámetro.Por ejemplo:
Y lea estos argumentos en
onCreate
:De esta manera, si se desconecta y vuelve a adjuntar, el estado del objeto se puede almacenar a través de los argumentos, de forma muy similar a
bundles
adjuntar aIntent
s.fuente
Si usa parámetro para alguna clase. prueba esto
fuente
FragmentManager
, perderá mSomeInstance.Creo que no hay diferencia entre el constructor estático y dos constructores (uno vacío y parametrizado que almacena argumentos en un paquete de argumentos de Fragment), lo más probable es que esta regla general se cree para reducir la probabilidad de olvidar implementar un constructor sin argumentos en Java , que no se genera implícitamente cuando hay sobrecarga presente.
En mis proyectos utilizo Kotlin e implemento fragmentos con un constructor primario sin argumentos y un constructor secundario para argumentos que solo los almacena en un paquete y lo configura como argumentos Fragmento, todo funciona bien.
fuente
Si el fragmento usa constructores no predeterminados después de cambiar la configuración, el fragmento perderá todos los datos.
fuente