Crear y Leer JSON desde Android

Blog >Comunicación con servidor > parseando con JSON en Android


Hola developers, vamos a ver como se parsea un documento JSON en Android.



JSON EN ANDROID

JSON (JavaScript Object Notation) es un formato para intercambiar datos, JSON los describe con una sintaxis dedicada que se usa para identificarlos y gestionarlos. 

JSON es una alternativa a XML,y el fácil uso en javascript ha generado un gran numero de seguidores. Una de las mayores ventajas que tiene el uso de JSON es que puede ser leído por cualquier lenguaje de programación. Así que en resumen, puede ser usado para el intercambio de información entre tecnologías distintas.

Según esté realizado el formulario, nos encontraremos con arrays u objetos, y así lo representaremos en el código.






Por ejemplo tenemos este código en JSON, hay herramientas online para la visualización de nuestro archivo JSON y para que se nos ayude con la sintaxis, como por ejemplo JSON Viewer

{
    "Personajes": [
        {
                "Equipo": "Elfos",
                "name": "Arwen",
                "Especialidad":"guerrero",
                "image": "http://oi60.tinypic.com/2emoi7n.jpg",
                "Habilidades": {
                    "Fuerza": "7",
                    "Espiritu": "2",
                    "Fortaleza": "8"
                }
        },
       {
                "Equipo": "Orcos",
                "name": "Arwen",
                "Especialidad":"Brujo",
                "image": "http://oi59.tinypic.com/2jetzl0.jpg",
                "Habilidades": {
                    "Fuerza": "1",
                    "Espiritu": "10",
                    "Fortaleza": "5"
                }
        },
        {
                "Equipo": "Humanos",
                "name": "Arwen",
                "Especialidad":"Mago",
                "image": "http://oi61.tinypic.com/msoyfa.jpg",
                "Habilidades": {
                    "Fuerza": "1",
                    "Espiritu": "9",
                    "Fortaleza": "3"
                }
        }
  ]
}

Este archivo le podeis descargar desde aquí.

Comenzamos por subir el archivo con extension JSON, en este caso lo llamaremos "Archivo.json". Para hacer la prueba, lo subí a dropbox, pero no os olvideis de cambiar las 3 www del enlace que conseguireis, por dl para tener el acceso público, de todas formas podreis ver el ejemplo en una de las clases.

Como profesionales que somos, he usado dropbox para el ejemplo, pero los programadores debemos huir literalmente de lo "gratis", lo que no se paga, tiene una seguridad endeble, entre otras desventajas. 

También he subido estas imágenes a un servidor gratuito TinyPic, quiere decir que podeis usar el mismo archivo JSON que yo.

IMAGENES
Orco


Elfo



humano



Importamos estas librerías al proyecto para poder usar JSON :


Tendremos que guardar los datos en una clase JavaBeans, así que creamos la correspondiente a nuestro archivo JSON para trabajar y gestionar los objetos :

public class Personajes {

 private String nombre;
 private String profesion;
 private String equipo;
 private String Fuerza;
 private String Fortaleza;
 private String Espiritu;
 private String URLimagen;
 public Bitmap imagen;
 


 public Personajes() {
  super();
 }
 
 public String getEquipo() {
  return equipo;
 }
 public void setEquipo(String equipo) {
  this.equipo = equipo;
 }

 public String getNombre() {
  return nombre;
 }
 public void setNombre(String nombre) {
  this.nombre = nombre;
 }
 public String getProfesion() {
  return profesion;
 }
 public void setProfesion(String profesion) {
  this.profesion = profesion;
 }
 
 public String getFuerza() {
  return Fuerza;
 }
 public void setFuerza(String fuerza) {
  Fuerza = fuerza;
 }
 public String getFortaleza() {
  return Fortaleza;
 }
 public void setFortaleza(String fortaleza) {
  Fortaleza = fortaleza;
 }
 public String getEspiritu() {
  return Espiritu;
 }
 public void setEspiritu(String espiritu) {
  Espiritu = espiritu;
 }
 public String getURLimagen() {
  return URLimagen;
 }

 public void setURLimagen(String uRLimagen) {
  URLimagen = uRLimagen;
 }
 public Bitmap getImagen() {
  // TODO Auto-generated method stub
  return imagen;
 }
}


Ahora vamos con el código, pongo a continuación las dos partes del main :


Y este es el código Java de momento :

public class MainActivity extends Activity {

 private Button buscar;
 private ListView listaa;
 String searchTerm ;
 //SI OS FIJAIS LA URL EMPIEZA POR dl EN VEZ DE www
 String URL = "https://dl.dropbox.com/s/sjhj5zuxfu87vz5/Archivo.json?dl=0";
 
 Activity a;
 Context context;
 static ArrayList lista;
 JSONArray pers;

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lista = new ArrayList();
        a=this;
        context=getApplicationContext();
        listaa = (ListView) findViewById(R.id.listViewLista);
        buscar = (Button) findViewById(R.id.busqueda);
        //VEMOS QUE HAY EN EL EDITTEXT
     buscar.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    //AQUI ES LA EJECUCIÓN DEL PARSEO DEL XML
   }     
     });
     
 }
}



A continuación tenemos el método público que utilizaremos para leer nuestro archivo JSON. Este método crea la llamada al servicio web. No os olvideis de darle permisos de internet a la aplicación.


//CLASE PARA RECOJER EL CODIGO EN BRUTO DEL JSON
public class JSONParser {

   static String response = null;
   public final static int GET = 1;
   public final static int POST = 2;
   //CONSTRUCTOR
   public JSONParser() {
   }
   
   public String makeServiceCall(String url, int method) {
       return this.makeServiceCall(url, method, null);
   }
   //METODO PARA ESTABLECER CONEXIÓN
   public String makeServiceCall(String url, int method,List params) {
       try {
           //HTTP CLIENT
           DefaultHttpClient httpClient = new DefaultHttpClient();
           HttpEntity httpEntity = null;
           HttpResponse httpResponse = null;
            
           // AÑADIMOS PARAMETROS AL METODO POST
           if (method == POST) {
               HttpPost httpPost = new HttpPost(url);
               // adding post params
               if (params != null) {
                   httpPost.setEntity(new UrlEncodedFormEntity(params));
               }
               httpResponse = httpClient.execute(httpPost);
           } else if (method == GET) {
               // AÑADIMOS PARAMETROS AL METODO GET
               if (params != null) {
                   String paramString = URLEncodedUtils.format(params, "utf-8");
                   url += "?" + paramString;
               }
               //METODO GET
               HttpGet httpGet = new HttpGet(url);
               httpResponse = httpClient.execute(httpGet);

           }
           httpEntity = httpResponse.getEntity();
           response = EntityUtils.toString(httpEntity);
           //EXCEPCIONES
       } catch (UnsupportedEncodingException e) {
           e.printStackTrace();
       } catch (ClientProtocolException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }
       //DEVOLVEMOS RESPUESTA
        return response;
   }
}


Vamos a completar nuestro main con 2 clases que harán la función de hilos, uno es para cargar los datos del objeto JSON en un ArrayList y otro es para cargar los datos correspondientes en el ListView, están enlazados y el código está bastante explicado e intuitivo.

//HILO PARA CARGAR LOS DATOS DEL JSON EN UN ARRAYLIST
class GetContacts extends AsyncTask {
   ListView list;
        private ProgressDialog pDialog;
     //CONSTRUCTOR
        public GetContacts(ListView listaa) {
   this.list=listaa;
  }
     
  @Override
     protected void onPreExecute() {
             super.onPreExecute();
             pDialog = new ProgressDialog(MainActivity.this);
             pDialog.setMessage("Getting Data ...");
             pDialog.setIndeterminate(false);
             pDialog.setCancelable(true);
             pDialog.show();
       }
 
        @Override
        protected Void doInBackground(Void... arg0) {
            // CREAMOS LA INSTANCIA DE LA CLASE
            JSONParser sh = new JSONParser();
            String jsonStr = sh.makeServiceCall(URL, JSONParser.GET);
            
            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);
                    // Getting JSON Array node
                    pers = jsonObj.getJSONArray("Personajes");
 
                    // looping through All Equipos
                    for (int i = 0; i < pers.length(); i++) {
                        JSONObject c = pers.getJSONObject(i);
                        //RECOJEMOS DATOS EN VARIABLES
                        String equipo = c.getString("Equipo");
                        String name = c.getString("name");
                        String especialidad = c.getString("Especialidad");
                        String imagen = c.getString("image");
      
                        //SUBITEM CON LAS HABILIDADES
                        JSONObject habilidades = c.getJSONObject("Habilidades");
                        String fuerza = habilidades.getString("Fuerza");
                        String espiritu = habilidades.getString("Espiritu");
                        String fortaleza = habilidades.getString("Fortaleza");
 
      //CREAMOS OBJETO Y LO LLENAMOS
                        Personajes e=new Personajes();
                        e.setURLimagen(imagen);
                        e.setNombre(name);
                        e.setEquipo(equipo);
                        e.setProfesion(especialidad);
                        e.setEspiritu(espiritu);
                        e.setFortaleza(fortaleza);
                        e.setFuerza(fuerza);
                        // adding contact to contact list
                        lista.add(e);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("ServiceHandler", "Esta habiendo problemas para cargar el JSON");
            }
 
            return null;
        }
 
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing()){
                pDialog.dismiss();
         }
         new CargarListTask().execute();
    }
//HILO PARA CARGAR LOS DATOS EN EL LISTVIEW
class CargarListTask extends AsyncTask{
     @Override
     protected void onPreExecute() {
         // TODO Auto-generated method stub
         super.onPreExecute();
     }
     protected Adapter doInBackground(Void... arg0) {
         // TODO Auto-generated method stub
         try{
         }catch(Exception ex){
             ex.printStackTrace();
         }
   
         Adapter adaptador = new Adapter(a,lista);
         return adaptador;
     }
     @Override
     protected void onPostExecute(Adapter result) {
         // TODO Auto-generated method stub
         super.onPostExecute(result);
         listaa.setAdapter(result);
     }
 }
 }



Si colocamos cuando clickamos el botón...

new GetContacts(listaa).execute();

Ya está!! sólo necesitamos un adapter con un hilo, este hilo se encargará de llenar la imágen a partir de la URL de la imagen, de esas 3 que he puesto al principio :

public class Adapter extends BaseAdapter{
   
    protected Activity activity;
    //ARRAYLIST CON TODOS LOS ITEMS
    protected ArrayList items;
     
    //CONSTRUCTOR
    public Adapter(Activity activity, ArrayList items) {
        this.activity = activity;
        this.items = items;
      }
    //CUENTA LOS ELEMENTOS
    @Override
    public int getCount() {
        return items.size();
    }
    //DEVUELVE UN OBJETO DE UNA DETERMINADA POSICION
    @Override
    public Object getItem(int arg0) {
        return items.get(arg0);
    }

    //METODO PRINCIPAL, AQUI SE LLENAN LOS DATOS
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // SE GENERA UN CONVERTVIEW POR MOTIVOS DE EFICIENCIA DE MEMORIA
     //ES UN NIVEL MAS BAJO DE VISTA, PARA QUE OCUPEN MENOS MEMORIA LAS
 
        View v = convertView;
        //ASOCIAMOS LA VISTA AL LAYOUT DEL RECURSO XML DONDE ESTA LA BASE DE
 
       if(convertView == null){
            LayoutInflater inf = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inf.inflate(R.layout.list_item, null);
        }
  
        Personajes dir = items.get(position);
        //RELLENAMOS LA IMAGEN Y EL TEXTO
        //IMAGEN
        ImageView img = (ImageView) v.findViewById(R.id.imageView1);
  if(img != null) {
   new LoadImage(img).execute(dir.getURLimagen());
  }
        //CAMPOS
        TextView nombre = (TextView) v.findViewById(R.id.username);
        nombre.setText("NOMBRE : "+dir.getNombre());
        TextView clase = (TextView) v.findViewById(R.id.clase);
        clase.setText("PROFESION : "+dir.getProfesion());
        TextView equipo = (TextView) v.findViewById(R.id.equipo);
        equipo.setText("EQUIPO : "+dir.getEquipo());
        TextView fuerza = (TextView) v.findViewById(R.id.fuerza);
        //SUBCAMPOS
        fuerza.setText("FUERZA : "+dir.getFuerza());
        TextView fortaleza = (TextView) v.findViewById(R.id.fortaleza);
        fortaleza.setText("FORTALEZA : "+dir.getFortaleza());
        TextView espiritu = (TextView) v.findViewById(R.id.espiritu);
        espiritu.setText("ESPIRITU : "+dir.getEspiritu());
         
        // DEVOLVEMOS VISTA
        return v;
    }
 @Override
 public long getItemId(int position) {
  // TODO Auto-generated method stub
  return 0;
 }
 
 class LoadImage extends AsyncTask {
  ImageView bmImage;

  public LoadImage(ImageView bmImage) {
   this.bmImage = bmImage;
  }

  @Override
  protected Bitmap doInBackground(String... urls) {
   String urldisplay = urls[0];
   Bitmap mIcon11 = null;
   try {
    mIcon11 = BitmapFactory.decodeStream((InputStream)new URL(urldisplay).getContent());
     
   } catch (Exception e) {
    //Log.e("Error", e.getMessage());
    e.printStackTrace();
   }
   return mIcon11;
  }

  @Override
  protected void onPostExecute(Bitmap result) {
   bmImage.setImageBitmap(result);
  }
 }
}


Y por último el item_list....







Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir



Navigation Drawer con DrawerLayout comunicando fragments

Blog >Lista Soluciones > DrawerLayout con fragment


Hola amigos desarrolladores!! Después de ver los fragments en este post anterior, vamos a ver cómo jugar con ellos con un DrawerLayout además de implementar un ActionBar posteriormente.




DrawerLayout gestionando fragments "Navigation Drawer"


Antes de empezar voy a resaltar que este componente tiene bastantes incopatibilidades según la versión de Android que se use, así que no os desespereis. También hay que tener en cuenta que trabajamos con fragments, no con Actividades.

No es que se complique a la hora de escribir código, hay que enfocarlo de otra forma para para que concuerde de manera adecuada, es decir de forma autocontenida.

El autocontenido se refiere a todo lo que se encuentra en ella dentro sin necesidad de recurrir a contenidos externos como vinculos.


De momento nuestro activity_main será así :

<android.support.v4.widget.DrawerLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/drawer_layout"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >

<!-- Contenido principal -->

<FrameLayout
    android:id="@+id/contenedor_principal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent" >

 </FrameLayout>

<!-- Navigation Drawer -->

<ListView
 android:id="@+id/drawer"
 android:layout_width="240dp"
 android:layout_height="match_parent"
 android:layout_gravity="left"
 android:background="#EEE" />

</android.support.v4.widget.DrawerLayout>


Analicemoslo bien, el id del Drawer es super importante, y pensar que tenemos que hacer un listview con adapter para gestionar los fragmentos también tiene su trabajo, poco pero lo tiene, así que vamos a ello :

public class itemsMenu {

 private String Nombre;
 private String Descripcion;
 private Drawable img;
 private int id;
 
 public itemsMenu(int id,String nombre, String descripcion, Drawable img) {
  super();
  this.id=id;
  this.Nombre = nombre;
  this.Descripcion = descripcion;
  this.img = img;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getNombre() {
  return Nombre;
 }
 public void setNombre(String nombre) {
  Nombre = nombre;
 }
 public String getDescripcion() {
  return Descripcion;
 }
 public void setDescripcion(String descripcion) {
  Descripcion = descripcion;
 }
 public Drawable getImg() {
  return img;
 }
 public void setImg(Drawable img) {
  this.img = img;
 }
}



Bien, ya tenemos todo lo necesario para implementar nuestro Drawermenú, vamos al onCreate del main y tiene que quedar así :

public class MainActivity extends FragmentActivity {
  private Context context=this;
  private ListView lista;
  public static DrawerLayout drawerLayout;
  private ArrayList array;
  private FrameLayout contenedor_principal;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);   
        configurarObjetos();
    }
    public void configurarObjetos(){
        contenedor_principal=(FrameLayout) findViewById(R.id.contenedor_principal);
        lista = (ListView) findViewById(R.id.drawer);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        array = new ArrayList();
        llenarListaMenu(array);
        //ADAPTER
        MenuAdapter adaptador = new MenuAdapter(this, array);
        lista.setAdapter(adaptador);
    }
  //LLENAR LISTA DE OBJETOS DEL MENU
    public void llenarListaMenu(ArrayList arraydir){
     itemsMenu item;
        // Introduzco los elementos
        item = new itemsMenu(1, "Nirvana", "Heart, sharped box",getResources().getDrawable(R.drawable.ic_launcher));
        arraydir.add(item);
        item = new itemsMenu(2, "The pixies", "Where is my mind",getResources().getDrawable(R.drawable.ic_launcher));
        arraydir.add(item);
        item = new itemsMenu(3,"Bob Dylan","Hurrican Carter",getResources().getDrawable(R.drawable.ic_launcher));
        arraydir.add(item);
        item = new itemsMenu(4, "Toxicity","System of a down",getResources().getDrawable(R.drawable.ic_launcher));
        arraydir.add(item);
        item = new itemsMenu(5, "Maneras de vivir", "Rosendo",getResources().getDrawable(R.drawable.ic_launcher));
        arraydir.add(item);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}


Ejecutamos la aplicación e inicialmente aparecerá una pantalla en blanco, basta con apretar en el lado donde hemos puesto el drawer (en este caso izquierda) y arrastrar hacia la derecha, entonces tendrá esta apariencia :




La base ya está echa, ahora si queremos maquearlo un poquito, vamos a insertarle un header en la lista,¿Como se hace? Según instanciamos la lista antes de llenar el array escribimos :

  //HEADER
  View header=getLayoutInflater().inflate(R.layout.header_menu, null);
        lista.addHeaderView(header,null,false);


Donde R.layout.header_menu es un recurso xml que esta en la carpeta layout, y como podeis ver es super simple implementarlo en nuesta Lista de nuestro DrawerMenu :




<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/alertImage"
        android:layout_width="250dp"
        android:layout_height="233dp"
        android:clickable="false"
        android:focusable="false"
        android:src="@drawable/ic_launcher" />

</FrameLayout>

Y quedaría así :




Observamos que clickamos en cualquier item de la lista y no sucede nada, eso es porque tenemos que implementar el evento onClick en la lista

        lista.setOnItemClickListener(new OnItemClickListener(){
   @Override
   public void onItemClick(AdapterView parent, View view,int position, long id) {
    
    seleccionarItem(position);
   }
         
        });
  
//SELECCION DE FRAGMENT
 @SuppressLint("ResourceAsColor") 
 public void seleccionarItem(int posicion){
            switch (posicion) {
         // BOTON PLAY, PRIMERA POSICION = 0
                case 1:
     //fragment1
                    break;
                case 2:
                    //fragment2
                    break;
                case 3:
                 //fragment3
                    break;
                case 4:
                  //fragment4
                    break;
                case 5:
     finish
            }  
    }


Ya tenemos como gestionar los fragment, ahora lo que necesitamos es crear 4 fragments distintos para que se pueda navegar en ellos, voy a poner uno, pero se deben hacer 4 "copias" que más tarde cada uno le dará una personalización distinta.

¿Cómo creamos un fragment? 
Creamos un xml y una clase Java así : 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Fragmento 1"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#ffffff"
        android:textSize="30sp" />

</RelativeLayout>




public class Fragment_1 extends Fragment{
 
  public View onCreateView(LayoutInflater inflater, ViewGroup contenedor, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_1, contenedor, false);       
         return v;
     }
}


Vamos a darle la funcionalidad para la gestión eficiente de los fragmentos mediante la función seleccionarItem, así que vamos a poner nuestra activity_main así :

public class MainActivity extends FragmentActivity {
  private Context context=this;
  private ListView lista;
  public static DrawerLayout drawerLayout;
  private ArrayList array;
  private FrameLayout contenedor_principal;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);   
        configurarObjetos();
    }
    public void configurarObjetos(){
        contenedor_principal=(FrameLayout) findViewById(R.id.contenedor_principal);
        lista = (ListView) findViewById(R.id.drawer);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        //le ponemos el header
       // View header=getLayoutInflater().inflate(R.layout.header_menu, null);
        //lista.addHeaderView(header,null,false);
        //Lista de objetos
        array = new ArrayList();
        llenarListaMenu(array);
        //ADAPTER
        MenuAdapter adaptador = new MenuAdapter(this, array);
        lista.setAdapter(adaptador);
        //PARA QUE SEA POR DEFECTO EL FRAGMENT1
        seleccionarItem(0);
        
        lista.setOnItemClickListener(new OnItemClickListener(){
   @Override
   public void onItemClick(AdapterView parent, View view,int position, long id) {
    
    seleccionarItem(position);
   }
         
        });
    }
    //====================================================================================
    //SELECCION DE FRAGMENT
    @SuppressLint("ResourceAsColor") 
    public void seleccionarItem(int posicion){
        Fragment fragment=null;
        boolean salida=false;
               switch (posicion) {
            // BOTON PLAY, PRIMERA POSICION = 0
                 case 0:
                  fragment = new Fragment_1();
                   break;
                   case 1:
                       fragment = new Fragment_2();
                       break;
                   case 2:
                       fragment = new Fragment_3();
                       break;
                   case 3:
                     fragment = new Fragment_4();
                       break;
                   case 5:
                    salida=true;
                    //MARCAMOS EL CLICKADO
                    lista.setItemChecked(posicion, true);
                    drawerLayout.closeDrawer(lista);
                    finish();
               }
               //SI SE SALE DE LA APLICACIÓN, AL HACER EL CAMBIO DE FRAGMENT DARIA NULLPOINTEREXCEPTION
               if (salida==false){
                //HACEMOS USO DE LA LIBRERIA
                FragmentManager fragmentManager=getSupportFragmentManager();
       //REEMPLAZAMOS
                fragmentManager.beginTransaction().replace(R.id.contenedor_principal, fragment).commit();
                //MARCAMOS EL CLICKADO
                lista.setItemChecked(posicion, true);
                drawerLayout.closeDrawer(lista);
            }
     
       }
  //LLENAR LISTA DE OBJETOS DEL MENU
    public void llenarListaMenu(ArrayList arraydir){
     itemsMenu item;
        // Introduzco los elementos
        item = new itemsMenu(1, "Nirvana", "Heart, sharped box",getResources().getDrawable(R.drawable.ic_launcher));
        arraydir.add(item);
        item = new itemsMenu(2, "The pixies", "Where is my mind",getResources().getDrawable(R.drawable.ic_launcher));
        arraydir.add(item);
        item = new itemsMenu(3,"Bob Dylan","Hurrican Carter",getResources().getDrawable(R.drawable.ic_launcher));
        arraydir.add(item);
        item = new itemsMenu(4, "Toxicity","System of a down",getResources().getDrawable(R.drawable.ic_launcher));
        arraydir.add(item);
        item = new itemsMenu(5, "Fin", "Salir de la aplicación",getResources().getDrawable(R.drawable.ic_launcher));
        arraydir.add(item);
    }


Y ya tenemos nuestro navigation drawer que navega entre fragmentos, este es el resultado :



"En el futuro los ordenadores no pesarán más de 1.5 toneladas. "
"Popular Mechanics, 1949"


Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir



Comunicación entre fragment en Android con un listener

Blog >Lista Soluciones > Fragments II



Comunicación entre fragments 

Vamos con la continuación del post anterior en el que hablamos sobre los fragments, ahí encontrareis las clases para formar el código necesario para nuestra Activity con el combo de los 3 fragmentos.La habíamos acabado con este aspecto :




Vamos a cambiar subir 4 imágenes distintas, yo he usado las de unos amiguetes para que al pulsar en el listView de la izquierda cambie la descripción y la foto.


Cómo es la comunicación entre fragment 

Antes de seguir, es necesario saber como se comunican los fragment entre ellos, ya que a la hora de trabajar con ellos es indispensable. Para usar los componentes de cada uno debemos desarrollarlos de forma totalmente autocontenida (se refiere a todo lo que se encuentra en ella sin necesidad de recurrir a contenidos externos como vinculos) pudiendo asociarlos con una Activity para crear una interfad de usuario curiosa.


Lo más pro, es diseñando una interfaz, cosa que se explica aquí de forma muy correcta, ya que como otras veces digo, yo me enfoco más en la parte práctica del código. 

También podeis consultar la documentación oficial sobre ListFragment aquí.

En definitiva, creamos un "listener" mediante la interactuación de una interfaz con el main y el fragment Lista, lo tendremos que modificar :

Creamos una clase con nuestra interfaz

public interface InterfacePersonaSeleccionada {
 public void onPersonaSelect(item str);
}

Y después nuestro Fragment Lista lo dejamos así :

public class Fragment_Lista extends Fragment{
 //INTERACTUACION CON LA INTERFAD
 private InterfacePersonaSeleccionada listener;
 
    public void setListener(InterfacePersonaSeleccionada listener) {
        this.listener=listener;
    }
  
 private ListView listado;
 
 Fragment_Lista flist;
 FragmentDetalle fdetalle;
 FragmentFoto fFoto;
 
 private item[] datos =new item[]{
                new item("Paquito", "Rapper Boy", "Badajoz rules, I love my gym!!"),
                new item("Nona", "Vazquez Rebuenona", "Alternativa vividora"),
                new item("Pedro", "Peña Irlandes", "No es que sea serio, soy un borde"),
                new item("Lunares", "Romero Pochita", "Mi habibi")};
 
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
 
  View v=inflater.inflate(R.layout.listado, container, false);
        return v;
    }
    
    public void onActivityCreated(Bundle state) {
        super.onActivityCreated(state);
 
        listado = (ListView)getView().findViewById(R.id.lista);
        listado.setAdapter(new AdapterList(this,datos));
        
        listado.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView list, View view, int pos, long id) {
                if (listener!=null) {
                    listener.onPersonaSelect(datos[pos]);

                }
            }
        });
    }


El adaptador lo he omitido pero sigue ahí en la misma clase , si os fijais bien el listener y el evento onClick interactúan en el método onActivityCreated que es cuando se acaba de crear el fragment, y en método setListener se nos obliga a implementar debido a las características de la interfaz. 

Si quereis documentación a cerca de qué son las interfaces y para qué valen, podeis encontrarla aquí.

El tema es bastante abstracto y por desgracia más de uno no sabe para que sirve.... asi que si optas por no aprender su uso, cagada!! Hay millones de veces que gracias a las interfaces todo sale más técnico, correcto y por lo tanto, más profesional.

Y ya por último nuestro main :

public class MainActivity extends FragmentActivity  implements InterfacePersonaSeleccionada{
 
 //METODO DE LA INTERFAD, NUESTRO "LISTENER"
 @Override
 public void onPersonaSelect(item str) {
  // TODO Auto-generated method stub
  //REFERENCIAMOS LOS 2 FRAGMENTOS
  FragmentFoto fFoto =(FragmentFoto) getSupportFragmentManager().findFragmentById(R.id.fragmentFoto);
  FragmentDetalle fDetalle=(FragmentDetalle) getSupportFragmentManager().findFragmentById(R.id.fragmentDetalle);
  //ASIGNAMOS LOS VALORES
  fFoto.cambiarFoto(AsignarFoto(str));
  fDetalle.cambiarTexto(str.getDescripcion());
 }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
  Fragment_Lista LISTA = 
    (Fragment_Lista) getSupportFragmentManager().findFragmentById(R.id.fragmentLista);
  LISTA.setListener(this);
        
        
    }
 //FUNCION PARA ASIGNAR LA FOTO SEGUN EL OBJETO QUE NOS DE LA INTERFAZ AL HACER CLICK EN LA LISTA
    public Drawable AsignarFoto(item str){
     Drawable foto = null;
     
     if(str.getName().compareTo("Paquito")==0){
      foto = getResources().getDrawable(R.drawable.foto1);
     }else if(str.getName().compareTo("Nona")==0){
      foto = getResources().getDrawable(R.drawable.foto2);
     }else if(str.getName().compareTo("Pedro")==0){
      foto = getResources().getDrawable(R.drawable.foto3);
     }else if(str.getName().compareTo("Lunares")==0){
      foto = getResources().getDrawable(R.drawable.foto4);
     }
     return foto;
    }



Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 


Compartir Compartir Compartir Compartir



Fragment en Android

Blog >Lista Soluciones > Fragment I


Hola developers!! vamos hoy a ver un tema sobre un tipo de componentes relativamente nuevos: los Fragments.




Fragment 

Los fragments los podemos explicar diciendo que son trozos de vista que se pueden mostrar o no dependiendo de nuestros intereses, ya sea porque nos interesen distintas dimensiones de pantalla o en la orientación del dispositvo, podemos añadirlos cuando queramos. 

Recientemente los podemos ver en múltiples aplicaciones que hay subidas en Google Play, de hecho el menú que tiene Outlook o Gmail se componen de ellos. En Android usamos varias librerias para su implementación , no obstante antes de describir ninguna, vamos a ver el ciclo de vida de los Fragments :



Un Fragment depende de FragmentActivity y siempre descansa o puede pasar varias veces en FragmentActivity. 

Entonces se puede decir que su ciclo de vida depende del ciclo de vida de FragmentActivity. Para crear un fragment deberemos extender la clase "Fragment" y sobreescribir el método "onCreateView()" en el que devolveremos la vista de dicho fragment.En el sitio oficial de Android podreis curiosear todo lo que querais, os lo dejo aquí.

  • onCreate() : El sistema llama a este método a la hora de crear el fragmento, normalmente iniciaremos los componentes esenciales del fragmento.
  • onCreateView() : Se llamará al método cuando haya que crear la interface de usuario o vista, normalmente se devuelve la View del fragmento.
  • onPause() : Se llama método en el momento que el usuario abandone el fragmento, es un buen momento para guardar información.

public class FragmentOne extends Fragment{
 
    public static final String TAG = "ExampleFragment";
    private FragmentIterationListener mCallback = null;
 
    public interface FragmentIterationListener{
        public void onFragmentIteration(Bundle parameters);
    }
     
    public static ExampleFragment newInstance(Bundle arguments){
        ExampleFragment f = new ExampleFragment();
        if(arguments != null){
            f.setArguments(arguments);
        }
        return f;
    }
     //CONSTRUCTOR
    public FragmentOne(){
     
    }
     
    //El fragment se ha adjuntado al Activity
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }
     
    //El Fragment ha sido creado       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
     
    //La vista de layout ha sido creada y ya está disponible
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }
     
    //La vista ha sido creada y cualquier configuración guardada está cargada
    @Override
    public void onViewStateRestored(Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
    }
     
     
    //El Fragment ha sido quitado de su Activity y ya no está disponible
    @Override
    public void onDetach() {
        super.onDetach();
    }
     //El Fragment va a cargar su layout, el cual debemos especificar
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);      
  View v =  inflater.inflate(R.layout.examplefragment_view, container, false);  
    }
}


El LayoutInflater lo usaremos para inflar el layout de nuestro fragment. inflate recoge tres parámetros.

En el primero indicamos la id del layout de nuestro fragment,el view padre de nuestro fragment y un booleano que nos servirá para indicar si el inflado del layout debe ser insertado en el ViewGroup (En este caso es false porque se esta insertando directamente el layout en el ViewGroup).

El ViewGroup sera el "padre" donde se insertara el layout de nuestro fragment. El Bundle podremos utilizarlo para recuperar datos de una instancia anterior de nuestro fragment.
Incluyo ahora el método onActivityCreated, que nos vale para declarar las variables que tengan que ver con el Activity en onActivityCreated()

    //El Activity que contiene el Fragment ha terminado su creación
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }


Se deben instanciar los elementos que no sean vistas en el método onCreateView(), como botones, TextViews etc, el layout se carga también en ese método.


Agregar un fragment
 
Se pueden agregar mediante XML o Java :
XML

 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  
    <fragment
        android:name="com.fragments.fragmentOne"
        android:id="@+id/fragmentOne"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

Es necesario asignarle un identificador único para cada fragment, hay 3 maneras de declarar un fragment : 

  • android:id
  • android:tag
  • Recogida automática mediante la id de la vista 
 Java :

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragmentTwo);
  
    FragmentManager FM = getSupportFragmentManager();
    FragmentTransaction FT = FM.beginTransaction();
  
    Fragment fragment = new FragmentOne();
    FT.add(R.id.fragmentOne_container, fragment);
    FT.commit();
}


Bueno, una vez que ya está mas o menos explicado, vamos con un ejemplo que es como mejor se entiende, en este caso he de recalcar que voy a hacerlo sobre fragments estáticos.

Antes de liarlos con el código, quiero que veais el aspecto que va a tener :




Es un activitymain.xml que tiene 3 fragmentos, asociados cada uno a su correspondiente clase, el java de la clase principal es super sencillo, únicamente hay que indicarle que extienda de FragmentActivity :

Este es el aspecto de nuestro main.xml :

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/contenedorPrincipal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context="com.example.fragments.MainActivity" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

            <fragment
                android:id="@+id/fragmentLista"
                android:name="com.example.fragments.Fragment_Lista"
                android:layout_width="150dp"
                android:layout_height="fill_parent" />

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >

            <fragment
                android:id="@+id/fragmentFoto"
                android:name="com.example.fragments.FragmentFoto"
                android:layout_width="wrap_content"
                android:layout_height="180dp" />

            <fragment
                android:id="@+id/fragmentDetalle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="70"
                android:name="com.example.fragments.FragmentDetalle" />
        </LinearLayout>

</LinearLayout>

</FrameLayout>








public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
}


Y ahora vamos con los 3 fragments; cada uno está enfocado a una cosa distinta, uno a un TextView otro a un ImageView y otro a un ListView






public class FragmentDetalle extends Fragment{
 @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
 
        return inflater.inflate(R.layout.fragment_detalle, container, false);
    }
    public void cambiarTexto(String t) {
        TextView f =(TextView)getView().findViewById(R.id.Txt_d);
        f.setText(t);
    }

}






public class FragmentFoto  extends Fragment{
 @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
 
        return inflater.inflate(R.layout.fragment_foto, container, false);
    }
 
    public void cambiarFoto(Drawable foto) {
        ImageView f =(ImageView)getView().findViewById(R.id.fotito);
        f.setImageDrawable(foto);
    }
}


Ahora vamos con el listview, además del xml y de la clase java, usaremos el adapter y el item_list correspondiente, si quereis saber un poquito más sobre cómo van los adapters podeis verlo en este post.



list_item
item

package com.example.fragments;

public class item {
 private String name;
 private String apellidos;
 private String descripcion;
 
 
 
 public item(String name, String apellidos, String descripcion) {
  super();
  this.name = name;
  this.apellidos = apellidos;
  this.descripcion = descripcion;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getApellidos() {
  return apellidos;
 }
 public void setApellidos(String apellidos) {
  this.apellidos = apellidos;
 }
 public String getDescripcion() {
  return descripcion;
 }
 public void setDescripcion(String descripcion) {
  this.descripcion = descripcion;
 }
}


Este es el xml y la clase para el fragment list


public class Fragment_Lista extends Fragment{
 
@Override
 public void onStart() {
  // TODO Auto-generated method stub
  super.onStart();
 }

private ListView listado;
 
 private item[] datos =new item[]{
                new item("Paquito", "Rapper Boy", "Badajoz rules"),
                new item("Alisa", "Cuadros", "Ramstad compañera de trabajo"),
                new item("Felipe´s", "Fiestas", "Ojo tuerto"),
                new item("Lunares", "Romero Redondo", "Mi habibi")};
 
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
 
        return inflater.inflate(R.layout.listado, container, false);
    }
    
    public void onActivityCreated(Bundle state) {
        super.onActivityCreated(state);
 
        listado = (ListView)getView().findViewById(R.id.lista);
        listado.setAdapter(new AdapterList(this,datos));
        
        listado.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView list, View view, int pos, long id) {
               /* if (listener!=null) {
                    listener.onCorreoSeleccionado(
                        (Correo)lstListado.getAdapter().getItem(pos));
                }*/
            }
        });
    }

public class AdapterList extends ArrayAdapter {
        Activity context;
        item[] lista;

        AdapterList(Fragment context,item[] lista) {
            super(context.getActivity(), R.layout.list_item, lista);
            this.context = context.getActivity();
            this.lista=lista;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
         LayoutInflater inflater = context.getLayoutInflater();
         View item = inflater.inflate(R.layout.list_item, null);

         TextView name = (TextView)item.findViewById(R.id.nombre);
         name.setText(lista[position].getName());

         TextView ape = (TextView)item.findViewById(R.id.apellidos);
         ape.setText(lista[position].getApellidos());
         
        return(item);
        }
    }
}




Ya tenemos bastante verdad¿? Vamos ahora a ver la comunicación entre los fragments, estaría chulo que viésemos como al clickar en un item de la lista, cambiase la foto y el texto a mostrar... podremos verlo en el siguiente post.

Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir



Comunicación con servidores en plataformas moviles

Comunicación en Servidores

Sección del blog de Thebestandroide dedicada a las comunicaciones mediante Java y Objective - C con cualquier servidor de formas distintas y con distintos métdos, pudiendo enviar o recibir datos.

La programáción dedicada a las conexiones a Internet juegan un papel muy importante en esta época en las que guardamos mucha documentación personal en la nube o para acceder a cualquier recurso que esté colgado en la red.


Esta sección está echa con el objetivo de tener un repositorio de código orientado a programación Android e iOS, y soy partidario de la libre información, así que lo comparto con todos vosotros para darle un fin mayor que el beneficio profesional personal único.

Sé conservador en lo que haces, sé liberal en lo que aceptas de otros.
Jon Postel, máxima de diseño de protocolos de Red del IETF





Comunicación con servers desde Android e iOS


ANDROID


  • Trabajando desde mi aplicación Android con JSON
  1. Crear y leer un archivo JSON


  •  Mi aplicación Android con Twitter
  1. Mi aplicación Android con Twitter : Hacer aplicación Twitter y conseguir claves
  2. Mi aplicación Android con Twitter : Feed de Twitter
  3. Mi aplicación Android con Twitter : Cómo escribir un tweet autentificandonos con la cabecera de la conexión http

iOS



ESPACIO EN CONSTRUCCION, DISCULPEN LAS MOLESTIAS




Curso Express para aprender ASP.Net en 7 días

Curso Express ASP.Net en arquitectura MVC5 


Hola developers, entre distintas entrevistas de curros, me he tenido que actualizar un poquito, que hacía bastante que no lo tocaba. Dejo aquí un tutorial muy interesante y eficiente para aprender ASP.Net en poquito tiempo. Espero que os sirva!


 http://www.codeproject.com/Articles/207797/Learn-MVC-Model-View-Controller-step-by-step-in

iOS : Ejercicio 23. Acceder al directorio Documents de nuestro iPhone


Blog >Lista ejercicios >  Ejercicio 23





Ejercicio 23 : Accediendo al directorio Documents de nuestro proyecto

Acceder al directorio de la aplicación:
El directorio de la aplicación nos permiten guardar datos en cuatro lugares distintos :

  • DOCUMENTS : Ubicación principal donde la aplicación guarda sus datos.
  • PREFERENCES : No ha sido creado para manipular directamente los archivos.
  • CACHES : Guarda temporalmente los archivos que tienen que existir cuando se abre la aplicación.
  • TMP : Se usa para guardar los archivos temporales innecesarios una vez se abre la aplicación.


Las aplicaciones son las encargadas y únicas responsables de 
limpiar el contenido de estas carpetas para que el dispositivo se encuentre optimizado.

NSSearchPathForDIrectoriesInDomains : Sirve para obtener la ruta de los directorios Caches y Documents. La función devuelve una instancia de NSArray con el listado de directorios.

NSTemporalyDirectory : Sirve para obtener la ruta de la carpeta tmp.

stringByAppendingPathComponent:@"Datos.dat" : Nos permite acceder a Datos.dat  contenido en un directorio en concreto.


CLASE NSFileManager
Sólo puede haber una instancia única durante el ciclo de vida de la aplicación. Esta es la clase que nos permite manipular los archivos contenidos en los directorios de la aplicación.

Una vez leida esta pequeña introducción, vamos a empezar con el ejercicio.Comenzamos agregando una nueva clase de Objective C que herede de NSObject,hay que destacar que si hay alguna referencia a outlets no funcionará.Además hacemos que herede de NSCoding







En el .h creamos 2 variables para almacenar los datos, una para el nombre y otra para el teléfono.
NSCoding nos obliga a usar dos métodos de instancia encodeWithCoder y initWithCoder, cada uno de estos métodos codifican y decodifican sus propiedades. Para que quede más claro es como crear una especie de "almacen".

Un objeto puede recibir estos métodos cualquier número de veces. initWithCoder instruye al objeto para inicializar a partir de datos del codificador proporcionado sustituyendo a cualquier otro método de inicialización y sólo se envía una vez al objeto.

.h
//  Datos.h
//  Documents
//
//  Created by makone moreno on 20/09/14.
//  Copyright (c) 2014 makone moreno. All rights reserved.
//
#import 
@interface Datos : NSObject 
@property (nonatomic,strong) NSString *nombre;
@property (nonatomic,strong) NSString *telefono;

@end

.m
//  Datos.m
//  Documents
//
//  Created by makone moreno on 20/09/14.
//  Copyright (c) 2014 makone moreno. All rights reserved.
//
#import "Datos.h"
@implementation Datos

@synthesize nombre;
@synthesize telefono;

//METODO PARA  INICIALIZARLAS, SUPERCLASE
-(id)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]){
        nombre = [aDecoder decodeObjectForKey:@"nombre"];
        telefono = [aDecoder decodeObjectForKey:@"telefono"];
    }
    return self;
}

//METODO QUE SIRVE PARA CODIFICAR LAS VARIABLES DEL OBJETO
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:nombre forKey:@"nombre"];
    [aCoder encodeObject:telefono forKey:@"telefono"];
    
}
@end

Abrimos nuestro storyboard e insertamos un botón, creamos la conexión y creamos un NSArray para guardar los contactos del telefono.




.H

//  ViewController.h
//  Documents
//
//  Created by makone moreno on 20/09/14.
//  Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//

#import 
#import "Datos.h"

@interface ViewController : UIViewController
@property (strong, nonatomic)NSArray *lista;
- (IBAction)BotonGuardar:(id)sender;
@end


.M

//  ViewController.m
//  Documents
//
//  Created by makone moreno on 20/09/14.
//  Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize lista;++
- (void)viewDidLoad
{
    [super viewDidLoad];
    //OBJETO PARA ALMACENAR RUTA
 NSArray *ruta= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //RUTA DOCUMENTS
    NSString *directorioDocuments = [ruta objectAtIndex:0];
    //BUSCAMOS EL ARCHIVO DatosContacto.dat
    NSString *rutaArchivo = [directorioDocuments stringByAppendingPathComponent:@"DatosContacto.dat"];
    
    //MENSAJE PARA SABER SI EL ARCHIVO EXISTE
    if([[NSFileManager defaultManager] fileExistsAtPath:rutaArchivo]==NO){
        UIAlertView *msgError = [[UIAlertView alloc] initWithTitle:@"DatosContacto.dat no encontrado" message:@"Creandolo..." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        
        [msgError show];
        //CONTACTO1
        Datos *d1 = [[Datos alloc]init];
        d1.nombre = @"Paca";
        d1.telefono = @"666666666";
        //CONTACTO2
        Datos *d2 = [[Datos alloc]init];
        d2.nombre = @"Eugenia";
        d2.telefono = @"777777777";
        //CONTACTO3
        Datos *d3 = [[Datos alloc]init];
        d3.nombre = @"Atapuerca";
        d3.telefono = @"888888888";
        
        lista = [NSArray arrayWithObjects:d1,d2,d3, nil];

    }else{
        //SI EL ARCHIVO EXISTE NO HAY QUE CREARLO, SIMPLEMENTE RECOGEMOS LOS CONTACTOS
        lista = [NSKeyedUnarchiver unarchiveObjectWithFile:rutaArchivo];
        //CREAMOS MENSAJE
        NSString *mensaje = [NSString stringWithFormat:@"Cargados %d objetos", [lista count]];
        //VENTANA DE AVISO
        UIAlertView *toast= [[UIAlertView alloc] initWithTitle:@"Archivo encontrado!" message:mensaje delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [toast show];
    }
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)BotonGuardar:(id)sender {
    NSArray *ruta = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //RUTA DOCUMENTS
    NSString *directorioDocuments = [ruta objectAtIndex:0];
    //BUSCAMOS EL ARCHIVO DatosContacto.dat
    NSString *rutaArchivo = [directorioDocuments stringByAppendingPathComponent:@"DatosContacto.dat"];
    //ALMACENAMOS EN UNA VARIABLE BOOLEANA EL RESULTADO DE SI SE HA ENCONTRADO O NO EL ARCHIVO
    BOOL result = [NSKeyedArchiver archiveRootObject:lista toFile:rutaArchivo];
    if (result == YES) {
        UIAlertView *msgError = [[UIAlertView alloc] initWithTitle:@"El archivo ya ha sido guardado" message:@"Creandolo..." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
   [msgError show];
    }else{
        UIAlertView *msgError = [[UIAlertView alloc] initWithTitle:@"Error al guardar el archivo" message:@"" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
   [msgError show];
    }
}
@end



Bien, vemos el resultado, la primera vez que se ejecuta la aplicación, no está creado el archivo, entonces :





Si pulsamos en el botón guardar, veremos esto :




Y por último, si volvemos a ejecutar la aplicación, veremos que ya se ha creado el archivo anteriormente :







Compartir Compartir Compartir Compartir 


Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio