Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: Reutilizar el mismo objeto de vista en diferentes actividades (el caso se trata de banners publicitarios)

Quiero reutilizar el mismo objeto de vista (no la clase de vista, o el archivo xml, me refiero al objeto en la memoria) en diferentes Actividades.

Casi lo hice. La cosa es, por supuesto, el contexto.

He intentado con el contexto de la aplicación. Casi funcionó, pero cuando hago clic en la vista que estoy transmitiendo entre diferentes actividades, y tratar de iniciar otra aplicación de ella (o enlace) se estrelló. (No recuerdo el choque exacto, pero lo cavaré, si lo necesitas).

Traté con alguna actividad, que no me importó fugas una vez, y dándole como un contexto. Funcionó, en realidad todo funcionó, hasta que comencé a obtener extrañas excepciones en ViewFlipper.

Mi pregunta es, ¿es esta reutilización realmente posible, y cómo hacerlo estable? ¿Tienes alguna experiencia con eso?

Muchas gracias por adelantado, Dan

5 Solutions collect form web for “Android: Reutilizar el mismo objeto de vista en diferentes actividades (el caso se trata de banners publicitarios)”

Tengo en cuenta que puede permitirse el escape de una actividad, ya que esta es la única solución que conozco: Declare una vista estática, diga myAdView en su primera actividad (en la que está solicitando anuncios). Ahora puede publicar y eliminar este myAdView en todas las transaciones de actividades. Ofcource tendrá que mantener LinearLayouts por separado para los anuncios ur en actividades separadas, donde se agregará / quitará el myAdView, por ejemplo. Supongamos que usted va de la actividad A a la B, entonces en la onPause de A elimine myAdView:

private LinearLayout layoutAd; layoutAd = (LinearLayout) findViewById(R.id.layout_ad); // from A's xml protected void onPause() { super.onPause(); layoutAd.removeView(FirstActivity.adBannerView); } 

Y en onResume de B agrega el mismo (FirstActivity) myAdView:

 private LinearLayout layoutAd; layoutAd = (LinearLayout) findViewById(R.id.layout_ad); // from B's xml protected void onResume() { super.onResume(); layoutAd.addView(FirstActivity.adBannerView); } 

Espero que esto solucione su problema hasta cierto punto.

¿Por qué no usas Fragmentos?

http://developer.android.com/guide/topics/fundamentals/fragments.html

Creo que su caso de uso es perfecto para esto.

Esto no es realmente posible en la forma que usted está pidiendo. Las vistas de una actividad deben estar infladas en el momento de la carga, copiar / referenciarlas en la memoria es poco probable que funcione como usted lo desea.

En su lugar, debe buscar crear la vista en cada actividad que necesite y transferir sólo los datos que necesita para rellenarlo en su lugar.

Si está intentando mejorar el rendimiento de su aplicación, recomendaría buscar formas de simplificar su vista, en lugar de violar el ciclo de vida de la actividad.

Actualizar:

Puesto que usted ha revelado el propósito detrás de esta pregunta (interceptar anuncios servidos de una biblioteca de terceros), le sugiero que primero contacte a la compañía y compruebe los términos de uso. Si permiten el uso de su servicio mientras evitan el código View, es posible que puedan proporcionarle una API de nivel inferior para mostrar los anuncios como mejor le parezca.

Si no se permite este uso, considere el hecho de que podría bloquear su cuenta (y retener el pago) por mal uso.

Si todavía quiere seguir adelante: NO corte los patrones de la interfaz de usuario de Android para que esto funcione. Extraiga las imágenes de anuncios de la biblioteca de terceros del lado del servidor (es decir, construya una aplicación web Java hospedada sencilla con almacén de caché y una API REST) ​​y publique los anuncios en su aplicación de Android desde este servicio "intermedio". Sin embargo, ciertamente no respaldo este método.

Acepto que usted está buscando alguna penúltima solución técnica para su enfoque, pero realmente creo que es el enfoque en sí mismo que es el problema aquí. Si estuviera en su posición, empezaría a buscar otras soluciones de publicación de anuncios que mejor se adapten a mis necesidades, además de contactar a los terceros para ver si puedo pagar por una integración personalizada. Cualquier cosa que implique transferir vistas infladas entre actividades está condenada a problemas constantes de mantenimiento, si funciona en absoluto.

Estoy en el mismo caso que Danail. La cosa no está a punto de cortar el proveedor de anuncios, pero que si desea mostrar un banner a través de diferentes actividades es una buena práctica en la publicidad no volver a cargarlo cada vez que cambie la actividad, ya que hacer más impresiones para que CTR Through Ratio) disminuirá. Prefiere volver a cargar el banner a la hora que fije, independientemente de los cambios de actividad.

Creo que la forma correcta de hacerlo sería, como dice NeTeInStEiN, usando fragmentos. Usted podría tener una actividad única compuesta por diferentes fragmentos. En uno de los fragmentos, por ejemplo en la parte inferior, tendrías el banner y lo cargarías una vez. Luego, en la zona más grande de la parte superior (digamos que estamos en un teléfono) que colocar diferentes fragmentos, uno a la vez, que correspondería a sus actividades existentes. Cuando normalmente "cambia" la actividad, ahora sólo cambiaría el fragmento "principal", pero el fragmento de banner permanecerá inalterado.

El problema principal y GRANDE de este enfoque es que es necesario diseñar la aplicación de esta manera desde el principio, ya que cambiar el modelo de aplicación de varias actividades a una actividad con varios fragmentos es un gran cambio de código …:

Así que entiendo que, para los costos de implementación, uno podría tratar de "llevar" la vista de una actividad a otra. Pero como vi en otras respuestas, en realidad no es recomendable y una forma problemática …

Si desea que una variable se utilice en varias actividades, la mejor práctica para ello es ponerlas en una clase separada (puede denominarse Constants o MyVars) como variable estática y usarlas en cualquier actividad que desee como Constants.SavedVar o MyVars.SavedVar como se muestra a continuación es un ejemplo de código.

 public class MyStaticVars { public static Context myContext; } // First Activity where you want to save a specific context MyStaticVars.myContext = ContextToBeSaved; // Any Other Activity where you want to reuse that context priviousContext = MyStaticVars.myContext; 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.