|
||
|
|
|
|||||||
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
|
Herramientas |
|
#21
|
||||
|
||||
|
Buenas!
voy a ir a la cama porque parecía que todo cuadraba y me salen errores de cierre de aplicación al probarlo! Lo dejo por aquí por si puediérais y os apetece echar un vistazo, mañana seguiré probando de todas formas ![]() [PHP]08-17 16:19:56.785 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ Late-enabling CheckJNI 08-17 16:19:57.081 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ GC_FOR_ALLOC freed 70K, 5% free 2753K/2880K, paused 17ms, total 17ms 08-17 16:19:57.093 4015-4015/com.apellido.nombre.paquete I/dalvikvm-heap﹕ Grow heap (frag case) to 3.742MB for 1048588-byte allocation 08-17 16:19:57.109 4015-4021/com.apellido.nombre.paquete D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 4% free 3777K/3908K, paused 16ms, total 16ms 08-17 16:19:57.361 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ GC_FOR_ALLOC freed 6K, 4% free 3788K/3908K, paused 23ms, total 23ms 08-17 16:19:57.385 4015-4015/com.apellido.nombre.paquete I/dalvikvm-heap﹕ Grow heap (frag case) to 4.751MB for 1048588-byte allocation 08-17 16:19:57.389 4015-4024/com.apellido.nombre.paquete D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 3% free 4811K/4936K, paused 4ms, total 4ms 08-17 16:19:57.585 4015-4015/com.apellido.nombre.paquete D/libEGL﹕ loaded /system/lib/egl/libEGL_genymotion.so 08-17 16:19:57.585 4015-4015/com.apellido.nombre.paquete D/﹕ HostConnection::get() New Host Connection established 0xb92d81f8, tid 4015 08-17 16:19:57.601 4015-4015/com.apellido.nombre.paquete D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_genymotion.so 08-17 16:19:57.605 4015-4015/com.apellido.nombre.paquete D/libEGL﹕ loaded /system/lib/egl/libGLESv2_genymotion.so 08-17 16:19:57.677 4015-4015/com.apellido.nombre.paquete W/EGL_genymotion﹕ eglSurfaceAttrib not implemented 08-17 16:19:57.677 4015-4015/com.apellido.nombre.paquete E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache 08-17 16:19:57.681 4015-4015/com.apellido.nombre.paquete E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 16384 08-17 16:19:57.697 4015-4015/com.apellido.nombre.paquete E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints() 08-17 16:19:57.697 4015-4015/com.apellido.nombre.paquete E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 16384 08-17 16:19:57.697 4015-4015/com.apellido.nombre.paquete D/OpenGLRenderer﹕ Enabling debug mode 0 08-17 16:19:59.849 4015-4015/com.apellido.nombre.paquete I/dalvikvm﹕ Could not find method android.view.ViewGroup.onNestedScrollAccepted, referenced from method android.support.v7.internal.widget.ActionBarOverla yLayout.onNestedScrollAccepted 08-17 16:19:59.849 4015-4015/com.apellido.nombre.paquete W/dalvikvm﹕ VFY: unable to resolve virtual method 11382: Landroid/view/ViewGroup;.onNestedScrollAccepted (Landroid/view/View;Landroid/view/View;I)V 08-17 16:19:59.849 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000 08-17 16:19:59.849 4015-4015/com.apellido.nombre.paquete I/dalvikvm﹕ Could not find method android.view.ViewGroup.onStopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverla yLayout.onStopNestedScroll 08-17 16:19:59.849 4015-4015/com.apellido.nombre.paquete W/dalvikvm﹕ VFY: unable to resolve virtual method 11388: Landroid/view/ViewGroup;.onStopNestedScroll (Landroid/view/View;)V 08-17 16:19:59.849 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000 08-17 16:19:59.849 4015-4015/com.apellido.nombre.paquete I/dalvikvm﹕ Could not find method android.support.v7.internal.widget.ActionBarOverla yLayout.stopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverla yLayout.setHideOnContentScrollEnabled 08-17 16:19:59.849 4015-4015/com.apellido.nombre.paquete W/dalvikvm﹕ VFY: unable to resolve virtual method 9071: Landroid/support/v7/internal/widget/ActionBarOverlayLayout;.stopNestedScroll ()V 08-17 16:19:59.849 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x000e 08-17 16:19:59.853 4015-4015/com.apellido.nombre.paquete I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getChangingConfigur ations, referenced from method android.support.v7.internal.widget.TintTypedArray. getChangingConfigurations 08-17 16:19:59.853 4015-4015/com.apellido.nombre.paquete W/dalvikvm﹕ VFY: unable to resolve virtual method 382: Landroid/content/res/TypedArray;.getChangingConfigurations ()I 08-17 16:19:59.853 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002 08-17 16:19:59.853 4015-4015/com.apellido.nombre.paquete I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray. getType 08-17 16:19:59.853 4015-4015/com.apellido.nombre.paquete W/dalvikvm﹕ VFY: unable to resolve virtual method 404: Landroid/content/res/TypedArray;.getType (I)I 08-17 16:19:59.853 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002 08-17 16:20:00.001 4015-4015/com.apellido.nombre.paquete W/EGL_genymotion﹕ eglSurfaceAttrib not implemented 08-17 16:20:02.792 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ GC_FOR_ALLOC freed 161K, 4% free 5330K/5548K, paused 5ms, total 5ms 08-17 16:20:02.796 4015-4015/com.apellido.nombre.paquete I/dalvikvm-heap﹕ Grow heap (frag case) to 6.258MB for 1048588-byte allocation 08-17 16:20:02.936 4015-4024/com.apellido.nombre.paquete D/dalvikvm﹕ GC_FOR_ALLOC freed 1K, 4% free 6353K/6576K, paused 141ms, total 142ms 08-17 16:20:03.012 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ GC_FOR_ALLOC freed 52K, 3% free 6471K/6632K, paused 4ms, total 4ms 08-17 16:20:03.076 4015-4015/com.apellido.nombre.paquete I/Choreographer﹕ Skipped 30 frames! The application may be doing too much work on its main thread. 08-17 16:20:03.272 4015-4015/com.apellido.nombre.paquete W/EGL_genymotion﹕ eglSurfaceAttrib not implemented 08-17 16:20:05.020 4015-4015/com.apellido.nombre.paquete W/ResourceType﹕ No package identifier when getting value for resource number 0x00000000 08-17 16:20:05.020 4015-4015/com.apellido.nombre.paquete D/AndroidRuntime﹕ Shutting down VM 08-17 16:20:05.020 4015-4015/com.apellido.nombre.paquete W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4d25b20) 08-17 16:20:05.024 4015-4015/com.apellido.nombre.paquete E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.apellido.nombre.paquete, PID: 4015 android.content.res.Resources$NotFoundException: String resource ID #0x0 at android.content.res.Resources.getText(Resources.ja va:244) at android.widget.TextView.setText(TextView.java:3888 ) at com.apellido.nombre.paquete.ConceptoAdapter.getVie w(ConceptoAdapter.java:43) at android.widget.AbsListView.obtainView(AbsListView. java:2255) at android.widget.ListView.onMeasure(ListView.java:11 47) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(Vie wGroup.java:5125) at android.widget.LinearLayout.measureChildBeforeLayo ut(LinearLayout.java:1404) at android.widget.LinearLayout.measureVertical(Linear Layout.java:695) at android.widget.LinearLayout.onMeasure(LinearLayout .java:588) at android.view.View.measure(View.java:16497) at android.widget.ScrollView.measureChildWithMargins( ScrollView.java:1226) at android.widget.FrameLayout.onMeasure(FrameLayout.j ava:310) at android.widget.ScrollView.onMeasure(ScrollView.jav a:326) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(Vie wGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.j ava:310) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(Vie wGroup.java:5125) at android.support.v7.internal.widget.ActionBarOverla yLayout.onMeasure(ActionBarOverlayLayout.java:453) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(Vie wGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.j ava:310) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(Vie wGroup.java:5125) at android.widget.LinearLayout.measureChildBeforeLayo ut(LinearLayout.java:1404) at android.widget.LinearLayout.measureVertical(Linear Layout.java:695) at android.widget.LinearLayout.onMeasure(LinearLayout .java:588) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(Vie wGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.j ava:310) at com.android.internal.policy.impl.PhoneWindow$Decor View.onMeasure(PhoneWindow.java:2291) at android.view.View.measure(View.java:16497) at android.view.ViewRootImpl.performMeasure(ViewRootI mpl.java:1912) at android.view.ViewRootImpl.measureHierarchy(ViewRoo tImpl.java:1109) at android.view.ViewRootImpl.performTraversals(ViewRo otImpl.java:1291) at android.view.ViewRootImpl.doTraversal(ViewRootImpl .java:996) at android.view.ViewRootImpl$TraversalRunnable.run(Vi ewRootImpl.java:5600) at android.view.Choreographer$CallbackRecord.run(Chor eographer.java:761) at android.view.Choreographer.doCallbacks(Choreograph er.java:574) at android.view.Choreographer.doFrame(Choreographer.j ava:544) at android.view.Choreographer$FrameDisplayEventReceiv er.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733 ) at android.os.Handler.dispatchMessage(Handler.java:95 ) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.jav a:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:601) at dalvik.system.NativeStart.main(Native Method) 08-17 16:20:05.032 4015-4015/com.apellido.nombre.paquete D/dalvikvm﹕ GC_FOR_ALLOC freed 131K, 3% free 7591K/7780K, paused 3ms, total 3ms[/PHP] Muchas gracias! |
|
|
|
#22
|
||||
|
||||
|
Hay algún elemento que IVA o PrecioPublico es 0, y alguno de los 2 elementos (supongo que PrecioPublico) será un Integer. En ese caso Android al hacer el setText trata de asignar el recurso con el ID del Integer, y no el texto del Integer, la solución es convertir el Integer a String con String.valueOf.
Así: EditText iva = (EditText) item.findViewById(R.id.ivaId); iva.setText(String.valueOf(datos.get(position).get Iva())); EditText precio = (EditText) item.findViewById(R.id.precioId); precio.setText(String.valueOf(datos.get(position). getPrecio_publico())); |
| Gracias de parte de: | ||
|
#23
|
||||
|
||||
|
Hay algún elemento que IVA o PrecioPublico es 0, y alguno de los 2 elementos (supongo que PrecioPublico) será un Integer. En ese caso Android al hacer el setText trata de asignar el recurso con el ID del Integer, y no el texto del Integer, la solución es convertir el Integer a String con String.valueOf.
Así: EditText iva = (EditText) item.findViewById(R.id.ivaId); iva.setText(String.valueOf(datos.get(position).get Iva())); EditText precio = (EditText) item.findViewById(R.id.precioId); precio.setText(String.valueOf(datos.get(position). getPrecio_publico())); ![]() Joder!! con perdón, pero si eso estoy harto de hacerlo... vaya saturación llevo, entre PHP por la mañana y resolución de incidencias y luego por la tarde Android T_T. En cuanto llegue a casa lo pruebo, y continúo con las pruebas para eliminar fila y almacenar todo... Lo próximo será almacenar bien las variables cuando cambia la app de estado, tengo onResume y estas cosas pero no estoy seguro de hacerlo bien, almaceno cada variable y luego las recupero a cada campo de texto, creo que es así. Bueno ya os contaré, mil gracias de nuevo
|
|
#24
|
||||
|
||||
|
Buenas!
Refloto el hilo después de vacaciones varias... Solamente una cosa, consigo que se creen bien y se añaden en el ListView del ScrollView, pero al hacer Scroll es lentísimo! no digo de lag, sino que hay que darle varias veces hacia arriba con el dedo para pasar de una línea a otra. He utilizado 200dp de height en lugar de wrap_content para que aparezcan tres visibles, pero es horrible el scrolling! he leído cosas sobre hacerlo con AsyncTask y demás pero no parece que sea lo que necesito, son 3 líneas contadas con unos campos de texto... Voy a seguir mañana mirándolo pero dejo esto por aquí por si a alguien le suena y me ahorra sudores ![]() Gracias de antemano! |
|
#25
|
||||
|
||||
|
¿Podría tal vez solucionarse con una barra lateral?
|
|
#26
|
||||
|
||||
|
Tienes algún evento en los elementos que hace que se invalide el evento de Touch del ScrollView, y por eso no se mueve. Cuando consigues que se mueva es porque estarás pulsando en alguna zona que no invalida.
|
| Gracias de parte de: | ||
|
#27
|
||||
|
||||
|
Qué alegría leerte, pues resulta que tengo un ScrollView para todo el layout porque si no no puedo ver la parte de abajo de la pantalla, que no cabe en la tablet, y es este el que "jode" el scrolling del otro. He probado a quitar el ScrollView "principal" y ya funciona perfecto el de abajo, el de los conceptos, pero claro esto no es lo que quiero... hay manera sencilla de hacer funcionar los dos Scrolls? Edit: Voy a probar esto... https://trivedihardik.wordpress.com/...lling-problem |
|
#28
|
||||
|
||||
|
A mi cuando se me ha presentado el caso lo he resuelto así, con el requestDisallowInterceptTouchEvent, pero luego al final he terminado buscando algún rediseño para la aplicación.
No es bueno tener 2 Scrolls en la misma dirección uno dentro de otro, porque te pasa lo que te está ocurriendo. La mejor solución será que hagas el ListView más pequeño para que así no necesites el ScrollView de fuera. Otra opción consiste en hacer que el ListView sea el último elemento de la Activity, y hacer que scrollee sólo cuando ha terminado el scroll principal mientras estés scrolleando hacia abajo, y en cuanto empiezas a hacerlo hacia arriba vuelves a scrollear al principal hacia arriba, en cuanto has llegado a la parte superior de la Activity sigues scrolleando al ListView hacia arriba. Y así sucesivamente. Suena complejo pero no lo es, es jugar comprobando las posiciones de los distintos scrolls y hacer el disallow según sea necesario. Con todo y con eso sigue siendo mala idea tener 2 scrolls en la misma dirección uno dentro de otro. |
| Gracias de parte de: | ||
|
#29
|
||||
|
||||
|
A mi cuando se me ha presentado el caso lo he resuelto así, con el requestDisallowInterceptTouchEvent, pero luego al final he terminado buscando algún rediseño para la aplicación.
No es bueno tener 2 Scrolls en la misma dirección uno dentro de otro, porque te pasa lo que te está ocurriendo. La mejor solución será que hagas el ListView más pequeño para que así no necesites el ScrollView de fuera. Otra opción consiste en hacer que el ListView sea el último elemento de la Activity, y hacer que scrollee sólo cuando ha terminado el scroll principal mientras estés scrolleando hacia abajo, y en cuanto empiezas a hacerlo hacia arriba vuelves a scrollear al principal hacia arriba, en cuanto has llegado a la parte superior de la Activity sigues scrolleando al ListView hacia arriba. Y así sucesivamente. Suena complejo pero no lo es, es jugar comprobando las posiciones de los distintos scrolls y hacer el disallow según sea necesario. Con todo y con eso sigue siendo mala idea tener 2 scrolls en la misma dirección uno dentro de otro. ![]() De esta manera lo solucioné y no recuerdo exactamente qué cambié, pero fue muy sencillo al darme cuenta de que no podía tratarlo como algo que no era, luego miro a ver qué cambié al final y lo pongo, es increíble no acordarme pero le di tantas vueltas... La solución de llegar al límite de un scroll para iniciar el otro deslizando desde el mismo punto me gusta mucho, pensaba que era muy complejo y ni he intentado pero me parece una gran solución para la experiencia de usuario, a ver si le pego un ojo. Mil gracias!! |
|
#30
|
||||
|
||||
|
Vale pues hice lo de capturar el toque de pantalla pero al ListView, y no al ScrollView que de hecho he podido eliminar, quedando un ListView dentro de un ScrollView:
[php]//ListView Scrolling fix! ListView lv = (ListView)findViewById(R.id.listConceptos); //The ListView inside ScrollView lv.setOnTouchListener(new ListView.OnTouchListener() { @override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: // Disallow ScrollView to intercept touch events. v.getParent().requestDisallowInterceptTouchEvent(t rue); break; case MotionEvent.ACTION_UP: // Allow ScrollView to intercept touch events. v.getParent().requestDisallowInterceptTouchEvent(f alse); break; } // Handle ListView touch events. v.onTouchEvent(event); return true; } });[/php] Gracias!! |
|
#31
|
||||
|
||||
|
Buenas de nuevo!!
Creo que el eliminar ya está funcionando, aunque digo "creo" porque cuando elimino una fila se borra la información de todas las demás también, pienso que al hacer el notify recarga todo y como la información está como temporalmente en el view pero no está guardado en el array no existe y al recargar no puede mostrarse. ¿Podríais decirme cómo implementar el guardado "on the fly" para tener la información almacenada en el array al cambiar de campo o mientras se escribe? He pensado almacenar todo en el array, pasarlo entero como parámetro al siguiente Activity, que es donde se muestra un resumen de la info escrita y al guardar ir recorriendo el array, meter la info de cada linea en un objeto Concepto y almacenarlo en la base de datos. ¿Es buen planteamiento? Gracias de antemano!! |
|
#32
|
||||
|
||||
|
En vez de una base de datos SQlite usa un ArrayList de objetos (un array de objetos de tipo Gasto p.ej. que tenga tres variables: concepto, iva y precio). Los datos están en esa estructura de datos (modelo), las filas del listview realmente no son más que una representación visual (vista) de esos datos.
En vez de un SimpleCursorAdapter usa un ArrayAdapter En vez de modificar la listview directamente o de añadir o eliminar vistas por tu cuenta, modifica el array de datos donde almacenes los valores de cada fila. Cuando modifiques algo (cambiar un valor, borrar o añadir un Gasto) tienes que llamar al método notifyDataSetChanged() del adapter para que la vista, es decir, la lista, se actualice con los nuevos datos. En otras palabras, no añades o quitas filas a la lista, las añades o quitas del array y ya se encarga Android de crear las filas. Para editar es igual, si quieres que un usuario modifique un campo de una fila concreta (por el ejemplo al añadir un nuevo gasto que por defecto estará todo a cero p.ej.), en el listener de esa fila gracias al parámetro position puedes llamar a adapter.getItem(position) y tendrás el objeto de tipo Gasto correspondiente para modificarlo. La clave es pensar en que los datos realmente no están en la lista o en los campos, están en un array y la lista se genera a partir de los datos de ese array. Ventajas: no te preocupas de las vistas, y los datos luego no hay que "leerlos de los campos" porque en cualquier momento el estado está guardado en un array. ![]() lo que trato de hacer es utilizar algún evento para guardar los datos de esa fila en un objeto en el array (o sin objeto?) y que se mantenga hasta que bien se actualice por añadir fila, eliminar una, etc. o bien se pase al siguiente activity y lo mande a guardar en la base de datos.Cualquier ayuda es agradecida, gracias! |
|
#33
|
||||
|
||||
|
Se cayó htcmania al enviar la respuesta antes, sniff.
Decía que para guardar tienes que escuchar los eventos de cambio de los elementos de la fila y actualizar el array, si no es normal que al hacer notifydatachanged se borre todo. Con los edittext por ejemplo es con el método addTextChangedListener. El listener lo creas al crear/inflar/reciclar la vista, y ahí ya sabes la posición del array donde tendrás que guardar el nuevo valor.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
| Gracias de parte de: | ||
|
#34
|
||||
|
||||
|
Se cayó htcmania al enviar la respuesta antes, sniff.
Decía que para guardar tienes que escuchar los eventos de cambio de los elementos de la fila y actualizar el array, si no es normal que al hacer notifydatachanged se borre todo. Con los edittext por ejemplo es con el método addTextChangedListener. El listener lo creas al crear/inflar/reciclar la vista, y ahí ya sabes la posición del array donde tendrás que guardar el nuevo valor. ![]() ![]() Lo que no me queda claro es lo que marco en negrita, por qué habría de saberlo? tengo un método para añadir filas pero realmente cómo conozco la línea que ocupa un EditText para saber con qué posición del array coincide? Hoy he estado revisando y añadiendo algunas cosas que faltaban y pienso que teniendo esto bien tendré una versión inicial utilizable del app ![]() Mil gracias de antemano! |
|
#35
|
||||
|
||||
|
Para crear una fila en el adapter tendrás por algún sitio un public View getView (int position, View convertView, ViewGroup parent)
Ese position es la posición del array, los edit text que haya en esa fila sabes que tienes que guardarlos en esa posición.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
|
#36
|
||||
|
||||
|
|
#37
|
||||
|
||||
|
Buenas de nuevo!
Me ha quedado bastante sencillo, solo necesito guardar información cuando acaba de escribirse, así que: [PHP] final EditText precio = (EditText) item.findViewById(R.id.precioId); precio.setText(String.valueOf(datos.get(position). getPrecio_publico())); precio.addTextChangedListener(new TextWatcher() { @override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @override public void onTextChanged(CharSequence s, int start, int before, int count) { } @override public void afterTextChanged(Editable s) { datos.get(position).setPrecio_publico(Integer.pars eInt(precio.getText().toString())); } });[/PHP] Creo que está correcto, muchas gracias!. Ahora me gustaría comentar lo que quiero hacer a ver si tiene sentido... en ese mismo Adapter tengo [PHP]private final ArrayList <Producto> datos;[/PHP] que es el Array con datos, bien pues desde el Activity que añado los conceptos, me gustaría obtener ese Array para pasarlo como variable al Activity que saca un resumen de los datos y ya finalmente almacena todo en SQLite... Pero aquí me viene una duda de concepto de Java que no comprendo. Para mí una clase es una estructura con datos y métodos, que una vez instanciados en un objeto puedes rellenar y utilizar, así todo muy resumido. Pues no comprendo cómo es posible que tengo una clase llamada Globals, donde tengo esto: [PHP]public class Globals { public static Parte parte = new Parte(); public static String signaturePath; public static String usuarioLogueado; public static ArrayList<Integer> listaConceptos = new ArrayList<>(); public static User currentUser = new User(); }[/PHP] Y desde cualquier Activity puedo hacer: [PHP] //Adding data to Parte instance of Globals class with static fields, to send them to the next Activity parte.setId_cliente(cliente); parte.setTecnico(tecnico); parte.setHora_inicio(hora_ini); parte.setHora_fin(hora_fin); parte.setNota_interna(notaInterna); parte.setNota_publica(notaPublica); parte.setPersona_contacto(nombre); parte.setDni(dni); parte.setEmail(email); Globals.parte = parte;[/PHP] Por poner un ejemplo, es decir que utilizo esa clase, sin instanciar como objeto (de hecho si lo usara como objeto no sería el tipo de global que quiero), y así por ejemplo me ahorro mandar datos en el Intent entre Activities, y tengo la información siempre disponible, de hecho es donde guardo la información del usuario logueado, etc. Esto lo vi por alguna web y por eso lo utilizo, pero francamente no entiendo cómo puede ser. Ahora me pregunto si puedo hacer lo mismo en el Adapter y hacer el Array "public", o bien crearle un método getArray, no sé cuál sería la forma correcta de obtener todos estos datos para enviarlos al siguiente Activity. ¿Es una aberración lo que hago con el Globals? ¿esa info puede irse sin previo aviso y perder por ejemplo la información del logueo del usuario?. Quizá tengo la mente demasiado en las sesiones de PHP... Gracias de nuevo por tantísima ayuda |
|
#38
|
||||
|
||||
|
Depende para que quieras hacerlo, a mi por ejemplo no me gusta usar propiedades estáticas en Android salvo para casos muy contados. Entre otras cosas porque sobreviven entre ejecuciones de la aplicación.
Es como preguntaban en otro hilo si algo era correcto, al final es correcto si tiene sentido para el problema que quieres solucionar. Lo único que hay que tener claro es el CONCEPTO de lo que significa y si lo estás aplicando bien. |
| Gracias de parte de: | ||
|
#39
|
||||
|
||||
|
Depende para que quieras hacerlo, a mi por ejemplo no me gusta usar propiedades estáticas en Android salvo para casos muy contados. Entre otras cosas porque sobreviven entre ejecuciones de la aplicación.
Es como preguntaban en otro hilo si algo era correcto, al final es correcto si tiene sentido para el problema que quieres solucionar. Lo único que hay que tener claro es el CONCEPTO de lo que significa y si lo estás aplicando bien. ![]() En este caso por ejemplo me interesa que sean valores que no se borren aunque el usuario suspenda la aplicación porque se apague la pantalla y vuelva en un ratito, deberia seguir con su usuario almacenado, pero tampoco me interesa que pueda reiniciar la tablet y esas variables estén todavía ahí, por ejemplo. ¿Qué manera utilizarías si quieres, por ejemplo, mantener entre Activities unos datos de login de usuario, o un objeto que quieres poder modificar desde cualquier sitio? Gracias! ;) |
|
|
|
#40
|
||||
|
||||
|
Los ciclos de vida de las variables, objetos y actividades dan para escribir mucho...
A los reinicios solo sobrevive lo que esté almacenado en almacenamiento persistente (memoria interna), es decir, las SharedPreferences, las bases de datos SQLite o en general cualquier fichero que guardes por tu cuenta en la memoria interna y/o en la SD. Los atributos de un objeto viven mientras viva el objeto. Los atributos estáticos no pertenecen a un objeto sino a la propia clase. Pueden haberse destruido todos los objetos (instancias) de una clase, que si había un valor estático, cuando crees otra instancia, ahí estará el valor salvo que la máquina virtual haya destruido todo para liberar recursos. En Android además están los Bundles para guardar el estado de una actividad, o los Intent para pasar información entre actividades, aunque de forma limitada (y tampoco sobreviven a reinicios) Usar valores estáticos es, como decía kriogeN, una opción que está ahí, si se usa bien no hay por qué no usarla. De hecho a Diana Hackborn (una de las ingenieras de Android) le encantan para todo lo que sea compartir datos comunes entre actividades. Yo lo uso para compartir un socket entre actividades, si bien es precisamente uno de los casos delicados (tengo bastante cuidado de llevar la cuenta de qué actividades lo están usando para cerrarlo cuando no hay ninguna). En cualquier caso, nadie te garantiza que cuando el usuario vuelva a la aplicación sigan estando los datos. Para situaciones de se apaga la pantalla y vuelve en un rato, lo normal es que sí. Si el usuario sale de la app, se pone a hacer otras cosas, le llaman, juega a algo, y vuelve... ya depende.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
| Gracias de parte de: | ||
![]() |
Estás aquí
|
||||||
|
||||||