2012-07-09 14 views
38

Hola, estaba viendo el siguiente ejemplo de Fragmentos en el sitio de Android.¿Cuál es el punto de setArguments?

http://developer.android.com/guide/components/fragments.html#Example

me gustaría saber por qué se realizan ciertos métodos.

¿Por qué, por ejemplo, en el detailsFragment es el siguiente método realizado:

public static DetailsFragment newInstance(int index) { 
    DetailsFragment f = new DetailsFragment(); 

    // Supply index input as an argument. 
    Bundle args = new Bundle(); 
    args.putInt("index", index); 
    f.setArguments(args); 

    return f; 
} 

Podría también no sólo una instancia del DetailsFragment y utilizar un método de selección para establecer index lugar. Pasando por alto el total setArguments.

¿De qué sirve usar en primer lugar? ¿No podrías usar setters y getters?

+3

Recientemente se ha vuelto común que la funcionalidad principal de una aplicación se encapsule en 'Fragmentos', y luego tiene' Actividades' esencialmente gestionar la disposición de (y la navegación entre) pantallas compuestas de dichos fragmentos. Con una "Actividad", podría pasar un "Paquete" de extras en un intento y tener acceso a eso inmediatamente comenzando con 'onCreate()'. 'Fragmentos' no responde a las intenciones, por lo que puede usar' setArguments() 'para proporcionarle un' Bundle' "de extras" antes de que se cree. – Karakuri

+0

@Karakuri gracias, es útil saberlo. – HGPB

+1

Eche un vistazo a este: http://stackoverflow.com/a/7160253/334493 –

Respuesta

36

Puede usar getters y setters, pero al pasar un paquete no necesita escribir ese código, ya que ya está allí. Además, creo que estos argumentos vuelven a pasar automáticamente si cambia la orientación de la pantalla, lo que también hace la vida más fácil.

Esencialmente, setArguments y getArguments es sólo un patrón de diseño que Google le sugiere que siga:

Cada fragmento debe tener un constructor vacío, por lo que puede ser instancia cuando se restaura el estado de su actividad. Se recomienda encarecidamente que las subclases no tengan otros constructores con los parámetros , ya que estos constructores no se invocarán cuando se vuelva a instanciar el fragmento ; en cambio, los argumentos pueden ser suministrados por el llamador con setArguments (Bundle) y luego recuperados por el Fragmento con getArguments(). http://developer.android.com/reference/android/app/Fragment.html

retiro lo dicho para incluir los emisores que son necesarios para su Fragmento de operar también. Por otra parte, no hay nada que te obligue a hacerlo de esta manera, y como sabes, no es la única forma en que se puede hacer que las cosas funcionen.

+0

Cosas buenas, solo dos maneras diferentes de hacer el mismo trabajo - bien. Su segundo punto hace que el uso de setArguments sea valioso solo por usar setters y getters si eso es cierto. En este caso, no estoy seguro de que suponga alguna diferencia. Pero podría estar equivocado. – HGPB

+0

¿Qué hay de dos constructores; uno vacío, y uno que acepta el estado inicial del fragmento. Un fragmento puede usar el paquete pasado en SaveInstanceState() y onCreate() para mantener el estado de la instancia? –

+0

Glenn, normalmente lo que hago es tener un método estático getInstance (..) que crea un paquete con todos los argumentos y usa setArguments() en una nueva instancia del fragmento. De esta forma tienes un "constructor" fácil de llamar, los argumentos se establecen, y Android tiene un buen constructor vacío que puede usar internamente. –

23

Solo para agregar a la respuesta de Matthew: citó correctamente que Fragments necesita tener un constructor vacío, para que el marco pueda volver a crear instancias cuando sea necesario.

Está bien utilizar getters y setters, pero como el framework puede destruir y volver a crear su Fragment, debe asegurarse de no perder esos parámetros.

Esto debe hacerse a través de Fragment.onSaveInstanceState(). El guardado indicado se le devolverá como el parámetro savedInstanceState en Fragment.onCreate(), Fragment.onCreateView() y varios otros métodos.

El uso de Fragment.setArguments() es (en la mayoría de los casos, supongo) más fácil, en el marco conservará automáticamente los argumentos y por lo tanto hará la mayor parte del trabajo por usted.

Los setters pueden ser el camino a seguir para los parámetros que usted suministra al Fragment inicialmente y que el fragmento puede ajustarse con el tiempo. Lidiar con savedInstanceState solo puede ser más fácil en este caso que tratar con savedInstanceState y los argumentos, donde tiene que tomar una decisión, que es el parámetro válido.

+4

Este es un aspecto críticamente importante para comprender Fragmentos que creo que pueden estar grotescamente infradimensionados. Su respuesta proporciona alguna idea. Si no desea utilizar setArguments, y en su lugar desea usar un setter, entonces DEBE usar onSaveInstanceState o android no podrá reinicializar su Fragment? ¡Dios! – rmirabelle

+3

@rmirabelle La subdocumentación parece ser el caso para muchos casos en Android, desafortunadamente. Descubrí una gran cantidad de casos que no son posibles o problemáticos y que no están documentados en absoluto o solo como un nodo lateral en algún lugar o los grupos de stackoverflow/google responden en algún lugar. – sstn

5
public void setArguments (Bundle args) 

de suministro los argumentos de construcción para este fragmento. Esto solo puede ser llamado antes de que el fragmento se haya adjuntado a su actividad; es decir, debe llamarlo inmediatamente después de construir el fragmento. Los argumentos proporcionados aquí serán retenidos a través fragmento destruyen y creación(pueden ser el texto en negrita que le faltaba a la documentación oficial anteriormente)

Fragments.setArguments(Bundle args)

+0

Gracias. Has confirmado este punto crítico al proporcionar la documentación relevante. – stevehs17

0

En emisores de adición puede ser mal utilizados . Si updateSomeOtherStuff() cambiará alguna vista, se bloqueará.

public class MyFragment extends Fragment { 
    void setData(someData){ 
     this.someData = someData; 
     updateSomeOtherStuff() 
    } 
} 

Si uno pasa en un paquete que no es posible hacer mal uso de la incubadora y siempre sabrá que esto se encuentra dentro de los métodos de ciclo de vida.