Tengo dos clases Primero es actividad, segundo es un fragmento donde tengo algoEditText
. En la actividad tengo una subclase con async-task y en el método doInBackground
obtengo algún resultado, que guardo en la variable. ¿Cómo puedo enviar esta variable de la subclase "mi actividad" a este fragmento?
android
android-fragments
usuario1302569
fuente
fuente
getArguments().getString(key)
También puede acceder a los datos de actividad desde el fragmento:
Actividad:
Fragmento:
fuente
Bundle
clase para pasar información. Alternativamente, puede hacer que esegetMyData()
método se herede e implemente desde una interfaz yFragment
verifique si getActivity devuelve unainstanceof
interfazonAttach()
.He encontrado muchas respuestas aquí @ stackoverflow.com pero definitivamente esta es la respuesta correcta de:
"Envío de datos de actividad a fragmento en Android".
Actividad:
Fragmento:
Leer el valor en el fragmento
o solo
fuente
Esta respuesta puede ser demasiado tarde. pero será útil para futuros lectores.
Tengo algunos criterios He codificado para elegir el archivo de la intención. y el archivo seleccionado para pasar a un fragmento particular para un proceso posterior. Tengo muchos fragmentos que tienen la funcionalidad de selección de archivos. en ese momento, cada vez que se verifica la condición y se obtiene el fragmento y se pasa el valor es bastante desagradable. Por lo tanto, he decidido pasar el valor utilizando la interfaz.
Paso 1: crea la interfaz en la actividad principal.
Paso 2: crear la referencia SelectedBundle en la misma actividad
Paso 3: crea el método en la misma actividad
Paso 4: necesita inicializar la referencia SelectedBundle, que son todos fragmentos, necesita la funcionalidad de selección de archivos. Coloque este código en su
onCreateView(..)
método de fragmentoPaso 5: Mi caso, necesito pasar la imagen Uri de HomeActivity a fragmentar. Entonces, utilicé esta funcionalidad en el método onActivityResult.
onActivityResult de MainActivity, pasa los valores a los fragmentos usando la interfaz.
Nota: su caso puede ser diferente. puede llamarlo desde cualquier lugar desde su HomeActivity.
Eso es todo. Implemente todos los fragmentos que necesita en FragmentClass. Eres genial. has hecho. GUAU...
fuente
La idea básica de usar Fragments (F) es crear componentes de interfaz de usuario autosustentables reutilizables en aplicaciones de Android. Estos Fragmentos están contenidos en actividades y hay una forma común (mejor) de crear vías de comunicación desde A -> F y FA. Es imprescindible comunicarse entre FF a través de una Actividad porque entonces solo los Fragmentos se desacoplan y se mantienen por sí mismos.
Por lo tanto, pasar datos de A -> F será el mismo que explica ρяσѕρєя K. Además de esa respuesta, después de la creación de los Fragmentos dentro de una Actividad, también podemos pasar datos a los fragmentos que invocan métodos en Fragmentos.
Por ejemplo:
fuente
El enfoque mejor y conveniente es llamar a la instancia de fragmento y enviar datos en ese momento. cada fragmento por defecto tiene método de instancia
entonces llamarás a tu fragmento de la actividad de esta manera:
* R.id.container es una identificación de mi FrameLayout
así que en MyFragment.newInstance ("data1", "data2") puede enviar datos a fragmentos y en su fragmento obtiene estos datos en MyFragment newInstance (String param1, String param2)
y luego en el método de fragmento onCreate obtendrás los datos:
fuente
Me gustaría agregar para los principiantes que la diferencia entre las 2 respuestas más votadas aquí está dada por el uso diferente de un fragmento.
Si usa el fragmento dentro de la clase java donde tiene los datos que desea pasar, puede aplicar la primera respuesta para pasar los datos:
Sin embargo, si utiliza, por ejemplo, el código predeterminado proporcionado por Android Studio para fragmentos con pestañas, este código no funcionará.
No funcionará incluso si reemplaza el PlaceholderFragment predeterminado con sus FragmentClasses, e incluso si corrige el FragmentPagerAdapter a la nueva situación agregando un interruptor para getItem () y otro interruptor para getPageTitle () (como se muestra aquí )
Advertencia: el clip mencionado anteriormente tiene errores de código, que explicaré más adelante, pero es útil para ver cómo pasar del código predeterminado al código editable para fragmentos con pestañas). El resto de mi respuesta tiene mucho más sentido si considera las clases de Java y los archivos xml de ese clip (representativo del primer uso de fragmentos con pestañas en un escenario para principiantes).
La razón principal por la que la respuesta más votada de esta página no funcionará es que en ese código predeterminado para fragmentos con pestañas, los fragmentos se usan en otra clase de Java: ¡FragmentPagerAdapter!
Entonces, para enviar los datos, tiene la tentación de crear un paquete en MotherActivity y pasarlo en el FragmentPagerAdapter, utilizando la respuesta n. ° 2.
Solo que eso está mal otra vez. ( Probablemente podría hacerlo así, pero es solo una complicación que realmente no es necesaria ).
Creo que la forma correcta / más fácil de hacerlo es pasar los datos directamente al fragmento en cuestión, utilizando la respuesta n. ° 2. Sí, habrá un fuerte acoplamiento entre la Actividad y el Fragmento, PERO, para los fragmentos con pestañas, eso es algo esperado. Incluso te aconsejaría que crees los fragmentos con pestañas dentro de la clase java MotherActivity (como subclases, ya que nunca se usarán fuera de MotherActivity). Es fácil, solo agrega dentro de la clase java MotherActivity tantos Fragmentos como necesites así:
Por lo tanto, para pasar datos de MotherActivity a un Fragmento de este tipo, deberá crear cadenas / paquetes privados sobre la actividad onCreate of your Mother, que puede completar con los datos que desea pasar a los fragmentos y transmitirlos a través de un método creado después de onCreate (aquí llamado getMyData ()).
Y luego, en la clase de fragmento, usas getMyData:
Si tiene consultas en la base de datos, le aconsejo que las haga en MotherActivity (y pase sus resultados como Strings / Integers adjuntos a las teclas dentro de un paquete como se muestra arriba), como dentro de los fragmentos con pestañas, su sintaxis se volverá más compleja (esto se vuelve getActivity () por ejemplo, y getIntent se convierte en getActivity (). getIntent), pero también tiene la opción de hacer lo que desee.
Mi consejo para principiantes es centrarse en pequeños pasos. Primero, obtenga su intención de abrir una actividad con pestañas muy simple, sin pasar CUALQUIER dato. ¿Funciona? ¿Abre las pestañas que esperas? Si no, ¿por qué?
Comience a partir de eso, y aplicando soluciones como las presentadas en este clip , vea lo que falta. Para ese clip en particular, el mainactivity.xml nunca se muestra. Eso seguramente te confundirá. Pero si presta atención, verá que, por ejemplo, el contexto (herramientas: contexto) es incorrecto en los archivos de fragmentos xml. Cada fragmento XML necesita apuntar a la clase de fragmento correcta (o subclase usando el separador $).
También verá que en la clase de actividad principal de Java necesita agregar tabLayout.setupWithViewPager (mViewPager) - justo después de la línea TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); sin esta línea, su vista en realidad no está vinculada a los archivos XML de los fragmentos, pero muestra SOLO el archivo xml de la actividad principal.
Además de la línea en la clase java de actividad principal, en el archivo XML de actividad principal debe cambiar las pestañas para que se ajusten a su situación (por ejemplo, agregar o quitar elementos de tabla). Si no tiene pestañas en el XML principal de la actividad, posiblemente no eligió el tipo de actividad correcto cuando lo creó en primer lugar (nueva actividad - actividad con pestañas).
¡Tenga en cuenta que en los últimos 3 párrafos hablo sobre el video! Entonces, cuando digo XML de actividad principal, es el XML de actividad principal en el video, que en su situación es el archivo XML de MotherActivity.
fuente
Si pasa una referencia al fragmento (subclase concreta de) en la tarea asincrónica, puede acceder al fragmento directamente.
Algunas formas de pasar la referencia del fragmento a la tarea asíncrona:
class FooTask extends AsyncTask
), entonces pase su fragmento al constructor.fuente
A veces puede recibir Intención en su actividad y necesita pasar la información a su fragmento de trabajo.
Las respuestas dadas están bien si necesita comenzar el fragmento pero si aún funciona,
setArguments()
no es muy útil.Otro problema ocurre si la información pasada hará que interactúe con su IU. En ese caso, no puede llamar a algo así
myfragment.passData()
porque Android le dirá rápidamente que solo el hilo que creó la vista puede interactuar.Entonces mi propuesta es usar un receptor. De esa manera, puede enviar datos desde cualquier lugar, incluida la actividad, pero el trabajo se realizará dentro del contexto del fragmento.
En tu fragmento
onCreate()
:En tu actividad:
fuente
Publicación muy antigua, aun así me atrevo a agregar una pequeña explicación que me hubiera sido útil.
Técnicamente, puede establecer directamente miembros de cualquier tipo en un fragmento de la actividad.
Entonces, ¿por qué Bundle?
La razón es muy simple: Bundle proporciona una forma uniforme de manejar:
- creación / apertura de fragmentos
- reconfiguración (rotación de pantalla) - solo agregue paquete inicial / actualizado a outState en onSaveInstanceState ()
- restauración de la aplicación después de recolectar basura en segundo plano ( como con la reconfiguración).
Puede (si le gustan los experimentos) crear una solución en situaciones simples, pero el enfoque de paquete simplemente no ve la diferencia entre un fragmento y mil en un backstack: sigue siendo simple y directo.
Es por eso que la respuesta de @Elenasys es la solución más elegante y universal.
Y es por eso que la respuesta dada por @Martin tiene dificultades
fuente
El mejor enfoque para enviar datos de la clase de actividad al fragmento es pasar a través de métodos de establecimiento. Me gusta
y obtener estos datos de la clase fácilmente.
fuente
Desde
Activity
usted envía datos con Bundle como:Y en el
Fragment
método onCreateView obtener los datos:fuente
Si
activity
necesitafragment
realizar una acción después de la inicialización, la forma más fácil esactivity
invocar un método en lafragment
instancia. En elfragment
, agregue un método:y luego en el
activity
, obtenga acceso alfragment
uso delfragment
administrador y llame almethod
:y luego
activity
pueden comunicarse directamente con elfragment
invocando estomethod
.fuente
onCreateView
método en el fragmento. fue realmente útilUse la siguiente interfaz para comunicarse entre la actividad y el fragmento
O utilice el seguimiento de este oyente genérico para la comunicación bidireccional usando la interfaz
método de presentación de fragmentos
puede emitir su contexto
GenericConnector
enonAttach(Context)
demasiadoen tu actividad
en tu fragmento
Nota: Nunca lo use de la misma
"".toString().toString().toString();
manera.fuente
simplemente tropecé con esta pregunta, mientras que la mayoría de los métodos anteriores funcionarán. Solo quiero agregar que puede usar la Biblioteca de bus de eventos , especialmente en escenarios donde el componente (Actividad o Fragmento) no se ha creado, es bueno para todos los tamaños de proyectos de Android y muchos casos de uso. Lo he usado personalmente en varios proyectos que tengo en la tienda de juegos.
fuente
Puede crear un método estático público en un fragmento donde obtendrá una referencia estática de ese fragmento y luego pasar datos a esa función y establecer esos datos en argumentos en el mismo método y obtener datos a través de getArgument en un método de fragmento creado, y establecer esos datos en local variables
fuente
La forma más inteligente de pasar datos entre fragmentos y actividad es crear una variable, por ejemplo:
Luego, para pasar datos del fragmento a la actividad, lo hacemos en el método onActivityCreated:
Ahora puede obtener el valor de StorageUtil.employees de todas partes. ¡Buena suerte!
fuente
Mi solución es escribir un método estático dentro del fragmento:
De esta manera, estoy seguro de que todos los datos que necesito están dentro del Fragmento antes de cualquier otra operación posible que pueda necesitar trabajar con él. También se ve más limpio en mi opinión.
fuente
Me encontré con un problema similar al usar el último componente de arquitectura de navegación. Probé todo el código mencionado al pasar un paquete de mi actividad de llamadas a Fragment.
La mejor solución, siguiendo las últimas tendencias de desarrollo en Android, es usar View Model (parte de Android Jetpack).
Cree e inicialice una clase ViewModel en la Actividad principal. Tenga en cuenta que este ViewModel debe compartirse entre la actividad y el fragmento.
Ahora, dentro del onViewCreated () del fragmento, inicialice el mismo ViewModel y configure Observers para escuchar los campos ViewModel.
Aquí hay un tutorial útil y detallado si lo necesita.
https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c
fuente
En tu actividad declara variable estática
Entonces en tu fragmento haz como seguir
fuente