vida studio setarguments putextra navegar llamar lanzar from fragments entre desde data ciclo activity abrir android android-fragments

android - studio - ¿Cuál es el punto de setArguments?



send data from activity to fragment (4)

Hola. Estaba viendo el siguiente ejemplo de Fragmentos en el sitio de Android.

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 los detalles? 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; }

¿No podría simplemente crear una instancia de DetailsFragment y usar un método setter para establecer el index lugar? Pasando por setArguments los setArguments completos.

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


Además los setters pueden ser mal utilizados. Si updateSomeOtherStuff () cambiará alguna vista, se bloqueará.

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

Si se pasa un paquete, no es posible utilizarlo indebidamente y siempre sabrá que esto se establecerá dentro de los métodos del ciclo de vida.


Puede utilizar 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.

Básicamente, setArguments y getArguments es solo un patrón de diseño que Google sugiere que sigas:

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

Lo tomo para incluir setters que son necesarios para que tu Fragment funcione 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.


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

Está bien usar 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.

Usar 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 a lo largo del 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.


public void setArguments (Bundle args)

Proporcione los argumentos de construcción para este fragmento. Esto solo se puede invocar 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í se conservarán a través de la destrucción y creación de fragmentos (puede ser que el texto en negrita haya desaparecido de la documentación oficial anteriormente)

Fragments.setArguments (Bundle args)