Ayuda con programación Android.

KoRMuZ

Buenas noches colegas y colegos.

Estoy haciendo para android una aplicación (la que me hará multimillonario y me hará poder comprar Google).

Pero, como todo se empieza pro abajo, estoy bastante liado con un ListView.

Necesito sacar el texto del elemento de la lista en el que se cliquee, para después pasarlo a otra actividad, pero no soy capaz de hacerlo después de dos o tres días.

Si alguno me puede echar un cable, se lo agradecería.

PD: Sí, he googleado bastante, hasta he descubierto stackoverflow xD

MTX_Anubis

http://developer.android.com/reference/android/widget/AdapterView.html#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener)

y

http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html

de ahí sacas la View que clickeas, la posición y la id.

Si para el texto que estás mostrando lo tienes en un string-array pues simplemente pasale la posición a la siguiente activity y lo sacas desde allí, o sacas el texto directamente y se lo pasas a la actividad.

Para intercambiar información ligera entre actividades con intent.putExtra(key,value) y luego en la actividad getIntent().getExtras().get(key)

Si no te aclaras pon el código de lo que tienes hecho porque depende del adapter que estés utilizando y como tengas almacenada la información.

1 respuesta
KoRMuZ

#2 Eso lo arreglé con los links que me pusiste. No me di cuenta de ponerlo por aquí antes. Gracias.

Ahora tengo otro problema, quiero crear un directorio en la SD, pero no hay forma. Este es el código pero no consigo que me lo cree

File folder = new File(Environment.getExternalStorageDirectory () + File.separator+"dir");
            if(folder.mkdirs()){
                CrearToast("Directorio creado");
            }else{
            	CrearToast("fallo");
            }

CrearToast me crea un toast con el texto que le pase, por si acaso lo aclaro xD

2 meses después
KoRMuZ

Aunque tenga tiempo este hilo, he preferido reflotarlo ya que aún sigo liado con lo mismo antes que abrir uno nuevo.

Ahora mi problema viene al querer añadir texto a un archivo en la SD.

El archivo se crea bien, y se guarda lo que quiero, pero no se añade, es decir, se sobreescribe.

	   public void AddItemToList(String sNombreArchivoConfig, String sNuevoItem){
	   try{
		   File carpetaRaiz = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "CarpetaConfig");
		   if (!carpetaRaiz.exists()){
			   CrearCarpeta();
			   CrearArchivoConfiguracion("config.txt");
		   }
   
File gpxfile = new File(carpetaRaiz, sNombreArchivo); FileWriter writer = new FileWriter(gpxfile); writer.append(sNuevoItem); writer.flush(); writer.close(); CrearToast("Guardado"); }catch(IOException e){ CrearToast(e.toString()); e.printStackTrace(); } }

Según esto, mirando en stack overflow y algunos sitios más, te debería añadir el texto al final del archivo, pero cuando lo pongo simplemente me sobreescribe lo que haya en el archivo.

Si alguno veis por donde puedo arreglar, o qué hago mal, avisadme.

N3uMaN

Creo que podría ser del constructor que usas para crear el FileWriter, sacado de la documentación:

"public FileWriter (File file, boolean append)
Since: API Level 1

Creates a FileWriter using the File file. The parameter append determines whether or not the file is opened and appended to or just opened and overwritten."

1 1 respuesta
KoRMuZ

#5 era eso, muchísimas gracias. Fue tan sencillo como poner un true al crear el FileWriter.

zenkiusomach

KoRMuZ

Otra vez estoy aquí

try {
		   BufferedReader br = new BufferedReader(new FileReader(file));
	     
while ((line = br.readLine()) != null) { text.append(line); text.append("\n"); item[contador] = br.readLine(); contador++; }

Me pone un warning en eclipse tal que así: "Null pointer access. The variable canciones can only be null at this location".

A ver si me podéis echar un cable.

PD: Mediavida llevará parte de los beneficios del programa a este ritmo xD

2 respuestas
bloodhound

#7 Dónde está la declaración de canciones? Para ver un poco más de por donde van los tiros.
Y me he fijado que haces dos "br.readLine()" en el bucle. La verdad es que sin un poco más de información no te puedo ayudar. Sorry

1 respuesta
elkaoD

#7 en qué linea?

1 respuesta
KoRMuZ

#9 en la línea 9 de #7. En este en la 18.

Este es completo #8.

File sdcard = Environment.getExternalStorageDirectory();
	   File file = new File(sdcard,archivoConCanciones);
	   if (file.exists()){
	   //Leemos el texto del archivo
	   StringBuilder text = new StringBuilder();
	   String line;
           String[] item;
           int contador = 0;

   try {
	   BufferedReader br = new BufferedReader(new FileReader(file));
     
	   while ((line = br.readLine()) != null) {

		   
		   text.append(line);
		   text.append("\n");
                       item[contador] = line;
                       contador++;
		  
	   }
	   if (text.toString() == "\n"){
		   texto.setText("No hay archivos en la lista.");
	   }
   }
   catch (IOException e) {
	   CrearToast(e.toString());
     e.printStackTrace();
 }
   texto.setText(text);
  
   //ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, item);
   //listaDeCanciones.setAdapter(adaptador);
   
   
 }else{
	 texto.setText("No hay archivos en la lista.");
 }
1 respuesta
elkaoD

#10 sólo has declarado item, pero no lo has inicializado. Deduzco por el código que tu archivo no tiene un número de líneas fijo ni lo especifica de antemano, así que como no puedes inicializar el array con un número de entradas concreto, deberías usar un ArrayList o algo de eso.

3 respuestas
KoRMuZ

#11 vale, muchísimas gracias. Luego lo intentaré a ver cómo sale.
Probé con

String[] item = null;[code] pero tampoco me sirvió de nada.

Cuando lo haga comento.
1 respuesta
BLZKZ

como dice #11 en algún momento tienes que decir que un array tiene un numero de posiciones concreto, en android/java no se como irá el tema listas/secuencias/whatever dinámico, pero ahí está la solucion, en C#+xna se que existen List y cosas asi xD

1 respuesta
KoRMuZ

#11 #13 ahora mismo ha estado un colega en mi casa y me ha hecho una cosa un pelín más basta pero que me funciona, a ver si tengog tiempo de mirar los arraylist y ya comento bien. Ahora el problema lo tengo con el ArrayAdapter que me da un force close

 	    	
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, itemsDeLaLista);
 	    	final ListView listaDeCosas = (ListView)this.findViewById(R.id.listaDeArchivos);
 	    	listaDeCosas.setAdapter(adaptador);
1 respuesta
BLZKZ

#14 mira usando esto, el funcionamiento debe ser sencillo http://developer.android.com/reference/java/util/List.html

Para estas cosas stackoverflow y developer.android.com suelen tener info bastante útil

elkaoD

#12 cómo pretendes arreglar un error porque un objeto no está inicializado poniéndolo a null? Precisamente el problema es que el objeto ya es null.

1 respuesta
N3uMaN

Algo como ésto te debería funcionar:

ArrayList<String> lineasLeidas = new ArrayList<String>();
.......
while(...){
   lineasLeidas.add(line);
}
ArrayAdapter adaptador = new ArrayAdapter(this, android.R.layout.simple_list_item_1, lineasLeidas);

De todas formas deberías mirarte las estructuras de datos más importantes de Java, porque sólo con Arrays no vas a ninguna parte.

Un saludo.

1 respuesta
KoRMuZ

#16 así lo tenía cuando me dio el fallo por primera vez y lo quité, quizás no me haya explicado bien.

1 respuesta
BLZKZ

#17 no hace ni falta que se mire tads de java dado que el propio sdk de android se los proporciona :/

#18 la solución la tienes usando lo de #15

edit:

List<String> lista = new List();

while ((line = br.readLine()) != null) 
{                
text.append(line); text.append("\n"); lista.add(line); }
1 respuesta
N3uMaN

#19 no sé que significa tads, pero si te refieres a estructuras de datos, las que se usan en Android, hasta donde yo sé, son las de Java.

Otra cosa, List es una interfaz del paquete java.util que es implementada por cada tipo de estructura de datos con forma de lista, ArrayList, LinkedList, etc, por lo que no puede ser instanciada. Lo normal sería hacer lo que puse en #17, cambiando ArrayList por el tipo de lista que él quiera.

1 respuesta
BLZKZ

#20 no me fije que era la interfaz, menuda cagada la mia xD, y eso de "estructura de datos de java" ejem xd, las estructuras de datos (tad) no son propias de un lenguaje y no solo hay una implementacion, y android tendra una porque usa unas librerias pero puedes usar cualquiera que te venga en gana

1 respuesta
N3uMaN

#21

Se sobreentiende que me refería a que en Android se suele usar la implementación que proporciona Java, evidentemente tú puedes hacer tu propia implementación.

No me acordaba de lo que signifcaban las siglas TAD, gracias por recordarmelo =)

1 respuesta
BLZKZ

#22 de todas formas conoces alguna biblioteca/libreria/lo que sea de tads para java que no sea la implementación de java.utils ?

Otra cosa el codigo que pusiste arriba de arraylist deberia funcionar, esta tarde cuando coja el PC si puedo actualizar el adt de eclipse lo pruebo a ver si el FC que le daba a #1 viene de ahí o es de otra cosa...

el problema debe venir en el constructor de arrayAdapter ni zorra. Aun así el FC puede ser cualquier cosa, incluso un problema del manifest.xml que unas veces funciona bien y otras no (true story bro xD a mi me pasaba con el mismo manifest)

1 respuesta
MTX_Anubis

#23 Eso suele ocurrir cuando cambias los xml. Lo suyo es hacer un clean del proyecto cuando sepas que tienes todo bien y te da errores (bendito eclipse, ya podría google hacer un puto IDE mejor que esa basura).

Pues no mola cuando regenera los resources como le sale de la minga y tienes los iconos y los layouts todos descolocados xD

O con los casting y te salta excepciones diciendo que no puedes instanciar un TextView en un Button y cosas así.

En fin xD

C

Lo de Eclipse es un poco de coña. Aunque hablo desde la experiencia de un inexperto (valga la paradoja xD).

Hace poco estuve indagando en una clase que hizo un puto crack por ahí para bindear un ViewPager (esto es algo bastante nuevo de la última actualización del SDK) con una cabecera y simular el desplazamiento entre layouts y/o actividades como hace, por ejemplo, la aplicación Android de Google+ o el mismo "escritorio" principal de Android.

Bien, pues resulta que venía un fichero (pom.xml) que tiene que ver con Maven. Para quien no lo sepa (yo lo se pero no lo domino), Maven es una especie de gestor de proyectos que coordina la inclusión y compilación de diferentes librerías en un sólo proyecto. Pues cuando te tienes que poner a actualizar el Eclipse con el plugin Maven y tal llega un momento que tiras la toalla y mandas todo a tomar por culo xDDDDDD. Es un pastel de pelotas.

Desde mi inexperiencia me voy a permitir criticar algo a Java y a los proyectos OpenSource que crecen de tal forma a veces descontrolada, que provoca que existan mil plugins, herramientas sueltas y, en definitiva, provocan un chocho de cojones a la hora de llevar a cabo algunos proyectos.

Y si viene alguien a decir que no tengo ni puta idea de Java y tal...: Acepto las críticas. Pero como programador con experiencia en otros entornos que lleva un par de meses tonteando con Android, esto es lo que pienso. Y eso que Android como tal me parece la ostia. Impresionante arquitectura. Lo que critico es la dispersión de herramientas y librerías y la falta de homogeneidad en algunas cosas (y sí, ya se que Maven casualmente está para evitar eso).

1 respuesta
elkaoD

#25 100% de acuerdo con la crítica a Java. Todo muy estándar para que luego las herramientas a su alrededor sean todas una mierda y con implementaciones rarísimas. Ant por ejemplo, es de locos, y en general todas las herramientas de build.

Sin embargo C que es lo más libre y carece del control de Oracle (antes Sun) y todo dios usa Makefiles, que son lo más cómodo del mundo. Simple = cómodo.

Usuarios habituales

  • elkaoD
  • MTX_Anubis
  • BLZKZ
  • N3uMaN
  • KoRMuZ
  • bloodhound