Introducción
En este tutorial vamos a mostrar como crear una aplicación que permita leer las noticias que están almacenadas en un rss en Internet.
La aplicación permitirá pulsar sobre cualquier noticia y mostrará la noticia de forma más detallada.
Espero que os guste y os resulta fácil. No dude en comentar.
¡ Saludos !
Enlaces de interés
Código Fuente
Puede descargar si lo desea el código fuente de este proyecto.
Pasos a seguir
1. Creamos la interfaz de la actividad principal en donde se le mostrará al usuario el listado de noticias extraídos del fichero rss, un ejemplo de interfaz sería el siguiente:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/lstvNoticias" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > </ListView> </RelativeLayout>
2. Creamos la interfaz de la segunda actividad encargada de mostrar en detalle la noticia, un ejemplo de interfaz sería el siguiente:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:orientation="vertical" > <TextView android:id="@+id/txtTitulo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Título" android:textAppearance="?android:attr/textAppearanceMedium" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="vertical" > <TextView android:id="@+id/txtFecha" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Fecha" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView android:id="@+id/txtLink" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Link" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> <ScrollView android:id="@+id/scrollView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_weight="18.59" > <TextView android:id="@+id/txtDescripcion" android:layout_width="match_parent" android:layout_height="match_parent" android:text="Descripción" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="16dp" /> </ScrollView> </LinearLayout> </RelativeLayout>
3. Creamos la clase modelo noticia la cual no servirá para poder guardas las noticias obtenidas del fichero rss.
package com.ACDAT.ejercicio10.Noticia; import java.io.Serializable; /** * Crea una noticia * * @author José Miguel Acosta Martín * */ @SuppressWarnings("serial") public class Noticia implements Serializable{ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private String titutlo; // Almacena el titulo de la noticia private String descripcion; // Almacena la descripción de la noticia private String fecha; // Almacena la fecha de la noticia private String link; // Almacena el link de la noticia ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTRUCTOR // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * Inicializa una nueva instancia de la clase * * @param titutlo Titutlo de la noticia * @param descripcion Descripción de la noticia * @param fecha Fecha de la noticia * @param link Link de la noticia */ public Noticia(String titutlo, String descripcion, String fecha, String link) { super(); this.titutlo = titutlo; this.descripcion = descripcion; this.fecha = fecha; this.link = link; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CONSTRUCTOR // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PROPIEDADES // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * * @return Obtiene el titulo de la noticia */ public String getTitutlo() { return titutlo; } /** * * @return Obtiene la descripción de la noticia */ public String getDescripcion() { return descripcion; } /** * * @return Obtiene la fecha de la noticia */ public String getFecha() { return fecha; } /** * * @return Obtiene el link de la noticia */ public String getLink() { return link; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN PROPIEDADES // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }
4. Una vez tengamos la clase modelo declaramos los campos que vayamos a utilizar de la actividad principal.
/** * Muestra un listado de noticas * Se puede seleccionar cualquier noticia para obtener más detalles * * @author José Miguel Acosta Martín * */ public class NoticiasActivity extends Activity { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private ListView lstvNoticias; // Campo gráfico que muestra un listado de noticias // Otros campos private URL url; // Almacena la url desde donde se descarga el fichero xml private ArrayList<Noticia> noticias; // Almacena las noticias private String[] tituloNoticias; // Almacena los titulos de las noticias private ArrayAdapter adaptador; // Adaptador ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
5. Creamos el método el cual obtendrá las noticias del fichero rss, la url desde el cual obtenemos el fichero rss es http://www.nerja.es/rss.php
/** * Obtiene y lee los datos del fichero xml */ public void leerDatos(){ // CAMPOS /////////////////////////////////////////////////////////////////////////////////////////////////////////// XmlPullParserFactory factory; XmlPullParser xml; // Almacena el recurso xml int evento; // Almacena el evento producido por el xml // Arrays ArrayList<String> titulos; // Almacena los titulos de las noticias ArrayList<String> descripciones; // Almacena las descripciones de las noticias ArrayList<String> fechas; // Almacena las fechas de las noticias ArrayList<String> links; // Almacena los links de las noticias // Banderas boolean esItem; // Indica si es una noticia boolean leerTitutlo; // Indica si se puede leer el titulo boolean leerDescripcion; // Indica si se puede leer la descripción boolean leerFecha; // Indica si se puede leer la fecha boolean leerLink; // Indica si se puede leer el link // FIN CAMPOS /////////////////////////////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN //////////////////////////////////////////////////////////////////////////////////////////////////////// // Incialización de arrays titulos = new ArrayList<String>(); descripciones = new ArrayList<String>(); fechas = new ArrayList<String>(); links = new ArrayList<String>(); // Inicialización de banderas esItem = false; leerTitutlo = false; leerDescripcion = false; leerFecha = false; leerLink = false; try { // Obtiene el fichero xml factory = XmlPullParserFactory.newInstance(); xml = factory.newPullParser(); xml.setInput(url.openStream(),"iso-8859-1"); // Obtiene el evento producido por el xml evento = xml.getEventType(); // Recorre el fichero xml while (evento != XmlPullParser.END_DOCUMENT){ switch (evento) { case XmlPullParser.START_TAG: // Controla si es el inicio de una noticia if (xml.getName().equals("item")){ esItem = true; } // Controla si es una noticia if (esItem){ // Si es una noticia ... // Comprobar inicio etiquetas/////////////////////////////// if (xml.getName().equals("title")){ leerTitutlo = true; } if (xml.getName().equals("link")){ leerLink = true; } if (xml.getName().equals("pubDate")){ leerFecha = true; } if (xml.getName().equals("description")){ leerDescripcion = true; } // FIN Comprobar inicio etiquetas ////////////////////////////// } break; case XmlPullParser.TEXT: // Almacenar el contenido de las etiquetas ///////////////////////// if (leerTitutlo){ titulos.add(xml.getText()); } if (leerLink){ links.add(xml.getText()); } if (leerFecha){ fechas.add(xml.getText()); } if (leerDescripcion){ descripciones.add(xml.getText()); } // FIN Almacenar el contenido de las etiquetas /////////////////////// break; case XmlPullParser.END_TAG: // Comprobar el fin de la etiquetas //////////////////////////////////// if (xml.getName().equals("title")){ leerTitutlo = false; } if (xml.getName().equals("link")){ leerLink = false; } if (xml.getName().equals("pubDate")){ leerFecha = false; } if (xml.getName().equals("description")){ leerDescripcion = false; } // Comprueba si es el final de la noticia if (xml.getName().equals("item")){ // Reinicia la bandera esItem = false; } // FIN Comprobar el fin de la etiquetas ////////////////////////////////// break; } // Avanza una posición en el fichero xml evento = xml.next(); } } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Almacena todas las noticias obtenidas almacenarNoticias(titulos, descripciones, fechas, links); // FIN EJECUCIÓN //////////////////////////////////////////////////////////////////////////////////////////////////// }
6. Creamos el método que nos permite guardar las noticias en la aplicación.
/** * Almacena las noticias * * @param titulos Titulos de las noticias * @param descripciones Descripciones de las noticias * @param fechas Fechas de las noticias * @param links Links de las noticias */ public void almacenarNoticias(ArrayList<String> titulos, ArrayList<String> descripciones, ArrayList<String> fechas, ArrayList<String> links){ // Recorre el array de titulos for (int i = 0; i < titulos.size(); i++){ // Almacena la noticia completa noticias.add(new Noticia(titulos.get(i), descripciones.get(i), fechas.get(i), links.get(i))); } }
7. Tendremos que obtener los títulos de todas las noticias para mostrarlas en la actividad para ello programamos el siguiente método. /**
* Obtiene y almacena los titulos de las noticias */ public void obtenerTitulos(){ // Inicializa el array tituloNoticias = new String[noticias.size()]; // Recorre todas las noticias for (int i = 0; i < noticias.size(); i++){ // Almacena el titulos de las noticia tituloNoticias[i] = noticias.get(i).getTitutlo(); } }
8. Finalmente inicializamos todos los campos en el método onCreate() de la actividad principal además de declarar y programar los eventos necesarios.
/** * Al iniciar la aplicación ... */ @SuppressLint({ "NewApi", "NewApi", "NewApi" }) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_noticias); // INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////////////////////////////// // Inicialización campos gráficos lstvNoticias = (ListView) findViewById(R.id.lstvNoticias); // Inicialización de otros campos try { url = new URL("http://www.nerja.es/rss.php"); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } noticias = new ArrayList<Noticia>(); // FIN INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////////////////////////// // Permisos para acceder a internet StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); // Lee los datos del fichero xml leerDatos(); // Almacena los titulos de las noticias obtenerTitulos(); // Adaptador para la lista adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tituloNoticias); // Se estaablece el adaptador a la lista lstvNoticias.setAdapter(adaptador); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // EVENTOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// lstvNoticias.setOnItemClickListener(new OnItemClickListener() { /** * Muestra detalladamente la noticia seleccionada */ public void onItemClick(AdapterView<?> adaptador, View vista, int posicion, long arg3) { // Obtiene la noticia Intent intent = new Intent(NoticiasActivity.this, NoticiaActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("NOTICIA", noticias.get(posicion)); intent.putExtras(bundle); // Envía la noticia e inicia la actividad NoticiaActivity para mostrar detalladamente la noticia startActivity(intent); } }); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN EVENTOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }
Aquí le muestro de forma más clara como quedarían unidos todos los métodos de la actividad principal.
package com.ACDAT.ejercicio10; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import org.json.JSONObject; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.StrictMode; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import com.ACDAT.ejercicio10.Noticia.Noticia; /** * Muestra un listado de noticas * Se puede seleccionar cualquier noticia para obtener más detalles * * @author José Miguel Acosta Martín * */ public class NoticiasActivity extends Activity { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private ListView lstvNoticias; // Campo gráfico que muestra un listado de noticias // Otros campos private URL url; // Almacena la url desde donde se descarga el fichero xml private ArrayList<Noticia> noticias; // Almacena las noticias private String[] tituloNoticias; // Almacena los titulos de las noticias private ArrayAdapter adaptador; // Adaptador ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MÉTODOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * Al iniciar la aplicación ... */ @SuppressLint({ "NewApi", "NewApi", "NewApi" }) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_noticias); // INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////////////////////////////// // Inicialización campos gráficos lstvNoticias = (ListView) findViewById(R.id.lstvNoticias); // Inicialización de otros campos try { url = new URL("http://www.nerja.es/rss.php"); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } noticias = new ArrayList<Noticia>(); // FIN INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////////////////////////// // Permisos para acceder a internet StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); // Lee los datos del fichero xml leerDatos(); // Almacena los titulos de las noticias obtenerTitulos(); // Adaptador para la lista adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tituloNoticias); // Se estaablece el adaptador a la lista lstvNoticias.setAdapter(adaptador); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // EVENTOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// lstvNoticias.setOnItemClickListener(new OnItemClickListener() { /** * Muestra detalladamente la noticia seleccionada */ public void onItemClick(AdapterView<?> adaptador, View vista, int posicion, long arg3) { // Obtiene la noticia Intent intent = new Intent(NoticiasActivity.this, NoticiaActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("NOTICIA", noticias.get(posicion)); intent.putExtras(bundle); // Envía la noticia e inicia la actividad NoticiaActivity para mostrar detalladamente la noticia startActivity(intent); } }); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN EVENTOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// } /** * Obtiene y lee los datos del fichero xml */ public void leerDatos(){ // CAMPOS /////////////////////////////////////////////////////////////////////////////////////////////////////////// XmlPullParserFactory factory; XmlPullParser xml; // Almacena el recurso xml int evento; // Almacena el evento producido por el xml // Arrays ArrayList<String> titulos; // Almacena los titulos de las noticias ArrayList<String> descripciones; // Almacena las descripciones de las noticias ArrayList<String> fechas; // Almacena las fechas de las noticias ArrayList<String> links; // Almacena los links de las noticias // Banderas boolean esItem; // Indica si es una noticia boolean leerTitutlo; // Indica si se puede leer el titulo boolean leerDescripcion; // Indica si se puede leer la descripción boolean leerFecha; // Indica si se puede leer la fecha boolean leerLink; // Indica si se puede leer el link // FIN CAMPOS /////////////////////////////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN //////////////////////////////////////////////////////////////////////////////////////////////////////// // Incialización de arrays titulos = new ArrayList<String>(); descripciones = new ArrayList<String>(); fechas = new ArrayList<String>(); links = new ArrayList<String>(); // Inicialización de banderas esItem = false; leerTitutlo = false; leerDescripcion = false; leerFecha = false; leerLink = false; try { // Obtiene el fichero xml factory = XmlPullParserFactory.newInstance(); xml = factory.newPullParser(); xml.setInput(url.openStream(),"iso-8859-1"); // Obtiene el evento producido por el xml evento = xml.getEventType(); // Recorre el fichero xml while (evento != XmlPullParser.END_DOCUMENT){ switch (evento) { case XmlPullParser.START_TAG: // Controla si es el inicio de una noticia if (xml.getName().equals("item")){ esItem = true; } // Controla si es una noticia if (esItem){ // Si es una noticia ... // Comprobar inicio etiquetas/////////////////////////////// if (xml.getName().equals("title")){ leerTitutlo = true; } if (xml.getName().equals("link")){ leerLink = true; } if (xml.getName().equals("pubDate")){ leerFecha = true; } if (xml.getName().equals("description")){ leerDescripcion = true; } // FIN Comprobar inicio etiquetas ////////////////////////////// } break; case XmlPullParser.TEXT: // Almacenar el contenido de las etiquetas ///////////////////////// if (leerTitutlo){ titulos.add(xml.getText()); } if (leerLink){ links.add(xml.getText()); } if (leerFecha){ fechas.add(xml.getText()); } if (leerDescripcion){ descripciones.add(xml.getText()); } // FIN Almacenar el contenido de las etiquetas /////////////////////// break; case XmlPullParser.END_TAG: // Comprobar el fin de la etiquetas //////////////////////////////////// if (xml.getName().equals("title")){ leerTitutlo = false; } if (xml.getName().equals("link")){ leerLink = false; } if (xml.getName().equals("pubDate")){ leerFecha = false; } if (xml.getName().equals("description")){ leerDescripcion = false; } // Comprueba si es el final de la noticia if (xml.getName().equals("item")){ // Reinicia la bandera esItem = false; } // FIN Comprobar el fin de la etiquetas ////////////////////////////////// break; } // Avanza una posición en el fichero xml evento = xml.next(); } } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Almacena todas las noticias obtenidas almacenarNoticias(titulos, descripciones, fechas, links); // FIN EJECUCIÓN //////////////////////////////////////////////////////////////////////////////////////////////////// } /** * Almacena las noticias * * @param titulos Titulos de las noticias * @param descripciones Descripciones de las noticias * @param fechas Fechas de las noticias * @param links Links de las noticias */ public void almacenarNoticias(ArrayList<String> titulos, ArrayList<String> descripciones, ArrayList<String> fechas, ArrayList<String> links){ // Recorre el array de titulos for (int i = 0; i < titulos.size(); i++){ // Almacena la noticia completa noticias.add(new Noticia(titulos.get(i), descripciones.get(i), fechas.get(i), links.get(i))); } } /** * Obtiene y almacena los titulos de las noticias */ public void obtenerTitulos(){ // Inicializa el array tituloNoticias = new String[noticias.size()]; // Recorre todas las noticias for (int i = 0; i < noticias.size(); i++){ // Almacena el titulos de las noticia tituloNoticias[i] = noticias.get(i).getTitutlo(); } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN MÉTODOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }
9. Ya en la segunda actividad declaramos los campos que vamos a utilizar.
/** * Muestra la noticica detalladamente * * @author José Miguel Acosta Martín * */ public class NoticiaActivity extends Activity { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private TextView txtTitulo; // Campo gráfico que muestra el título de la noticia private TextView txtDescripcion; // Campo gráfico que muestra la descripción de la noticia private TextView txtFecha; // Campo gráfico que muestra la fecha de la noticia private TextView txtLink; // Campo gráfico que muestra el link de la noticia ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10. Creamos el método que nos permitirá mostrar la noticia que recibimos a través de intent de la primera actividad.
/** * Obtiene y muestra la noticia */ public void mostrarNoticia(){ // CAMPOS //////////////////////////////////////////////////////////////////////////////////////////////////////////// Intent intent; Noticia noticia; // Almacena la noticia // FIN CAMPOS //////////////////////////////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ///////////////////////////////////////////////////////////////////////////////////////////////////////// // Obtiene la noticia intent = getIntent(); noticia = (Noticia) intent.getSerializableExtra("NOTICIA"); // Muestra la noticia txtTitulo.setText(noticia.getTitutlo()); txtDescripcion.setText(noticia.getDescripcion()); txtFecha.setText(noticia.getFecha()); txtLink.setText(noticia.getLink()); // FIN EJECUCIÓN ///////////////////////////////////////////////////////////////////////////////////////////////////// }
11. En el método onCreate() de la segunda actividad inicializamos los campos y llamamos al método mostrar noticia.
/** * Al iniciar la aplicación ... */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_noticia); // INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////////////////////////////// // Incialización de campos gráficos txtTitulo = (TextView) findViewById(R.id.txtTitulo); txtDescripcion = (TextView) findViewById(R.id.txtDescripcion); txtFecha = (TextView) findViewById(R.id.txtFecha); txtLink = (TextView) findViewById(R.id.txtLink); // FIN INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////////////////////////// // Muestra la noticia mostrarNoticia(); }
Finalmente la segunda actividad quedaría de la siguiente manera:
package com.ACDAT.ejercicio10; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; import com.ACDAT.ejercicio10.Noticia.Noticia; /** * Muestra la noticica detalladamente * * @author José Miguel Acosta Martín * */ public class NoticiaActivity extends Activity { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private TextView txtTitulo; // Campo gráfico que muestra el título de la noticia private TextView txtDescripcion; // Campo gráfico que muestra la descripción de la noticia private TextView txtFecha; // Campo gráfico que muestra la fecha de la noticia private TextView txtLink; // Campo gráfico que muestra el link de la noticia ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MÉTODOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * Al iniciar la aplicación ... */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_noticia); // INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////////////////////////////// // Incialización de campos gráficos txtTitulo = (TextView) findViewById(R.id.txtTitulo); txtDescripcion = (TextView) findViewById(R.id.txtDescripcion); txtFecha = (TextView) findViewById(R.id.txtFecha); txtLink = (TextView) findViewById(R.id.txtLink); // FIN INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////////////////////////// // Muestra la noticia mostrarNoticia(); } /** * Obtiene y muestra la noticia */ public void mostrarNoticia(){ // CAMPOS //////////////////////////////////////////////////////////////////////////////////////////////////////////// Intent intent; Noticia noticia; // Almacena la noticia // FIN CAMPOS //////////////////////////////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ///////////////////////////////////////////////////////////////////////////////////////////////////////// // Obtiene la noticia intent = getIntent(); noticia = (Noticia) intent.getSerializableExtra("NOTICIA"); // Muestra la noticia txtTitulo.setText(noticia.getTitutlo()); txtDescripcion.setText(noticia.getDescripcion()); txtFecha.setText(noticia.getFecha()); txtLink.setText(noticia.getLink()); // FIN EJECUCIÓN ///////////////////////////////////////////////////////////////////////////////////////////////////// } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN MÉTODOS // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }
13. Finalmente le datos los permisos de internet en el manifiesto de la aplicación para poder acceder a internet.
<uses-permission android:name="android.permission.INTERNET"/>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ACDAT.ejercicio10" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".NoticiasActivity" android:label="@string/title_activity_noticias" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".NoticiaActivity" android:label="@string/title_activity_noticia" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
FIN
excelente tutorial amigo..solo unas dudas al correrla en el AVD me lleva directo a la lista de mensajes y al seleccionar cualquier noticias, se vuelve a regresar...y no se porque y otra...cuando te sales totalmente de la aplicación y la quieres volver a abrir truena y se cierra...sabes porque?
ResponderEliminarBuenas y muchas gracias, he estado revisando la aplicación y no he sido capaz de encontrar el problema que me comentas, no sé si ya lo has probado, pero te recomiendo bajar el proyecto completo desde esta misma página, en el apartado de enlaces de interés podrás descargarte el código fuente preparado para exportarlo como proyecto en eclipse y ejecutarlo.
EliminarDe todas formas, sea el caso que sea, si sigues experimentando el problema me tendrías que dar más detalles o pasarme tu propio proyecto de eclipse para que yo le pudiera echar un vistazo y poder ver el error que quizás estés teniendo.
Muchas gracias y saludos.