Tutoriales

Guardar el estado de un Activity

publicado a la‎(s)‎ 14 oct. 2009 23:51 por Adrian Barajas   [ actualizado el 1 nov. 2012 23:48 ]

El mantener el estado anterior de un Activity demuestra que la aplicación desarrollada es profesional y ayuda al usuario en procesos repetitivos.

A continuación explicamos un método que se puede utilizar para soportar este comportamiento en las aplicaciones de una manera controlada y reutilizable.

Para este ejemplo vamos integrar guardar el estado del tabulador seleccionado para cuando se abra nuestra aplicación el tabulador seleccionado anteriormente se muestre marcado.

Para efectos de mostrar el mecanismo implementado no se incluye todo el codigo.

En algún lugar del metodo onCreate integramos la declaración de un tabhost:


     public void onCreate(Bundle savedInstanceState) {
 //..
         //..
// Create an Intent to launch an bond
   intent = new Intent().setClass(this, ActivityBond.class);

   // Initialize a TabSpec for each tab and add it to the TabHost
   spec = tabHost.newTabSpec("bond").setIndicator(getString(R.string.tab_bond),
                     res.getDrawable(R.drawable.sl_bond))
                 .setContent(intent);
   tabHost.addTab(spec);

 
   PrefsUtils pu = new PrefsUtils(PreferenceManager.getDefaultSharedPreferences(this));
   int noTab =  pu.loadTab();  
   
   onTabChanged("tab" + String.valueOf(noTab)  );
   tabHost.setCurrentTab(noTab);
       }

 Y el método onPause, integramos el código para guardar el estado del tabulador seleccionado.

       @Override
protected void onPause() {
     
 PrefsUtils pu = new PrefsUtils(PreferenceManager.getDefaultSharedPreferences(this));    
 pu.saveTab(getTabHost().getCurrentTab());
 super.onPause();
 
}

 En la declaración incluimos una clase que nos va a permitir guardar y recuperar la información bajo el modelo de datos estándar de Android. De tal manera que al llamar a loadTab se obtiene la información guardada del no. de tabulador seleccionado previamente. Una vez recuperado ese dato lo asignamos en setCurrentTab(noTab)
con esto definimos el tabulador correcto.

A continuación definimos la clase PrefsUtils:

package com.caleradreams.financalc;

import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import com.caleradreams.financalc.R;

public class PrefsUtils {
private SharedPreferences prefs;

        PrefsUtils(SharedPreferences prefs)  
this.prefs = prefs;
}

public int loadTab(){
int tabNo;
if (prefs.contains("tabmain.tab"))
     tabNo = prefs.getInt("tabmain.tab",0);
else
 tabNo = 0 ;
return (tabNo);
}
public boolean saveTab(int tab){
Editor mEditor = prefs.edit();
mEditor.putInt("tabmain.tab", tab);
mEditor.commit();
return true;
}
}

A través del objeto prefs, podemos acceder al repositorio de información basados en una clave en este caso "tabmain.tab", del cual recuperamos el indice seleccionado.

Siempre se debe evaluar si una llave especifica existe para poder recuperarla en este caso se utiliza. prefs.contains y el valor clave que deseamos evaluar. Posteriormente getInt nos permite recuperar un valor entero bajo la clave "tabmain.tab".

Para guardar información utilizamos la clase Editor, la cual nos permite guardar un entero en este caso con putInt la clave "tabmain.tab" y el dato tab. Finalmente debemos ejecutar el commit para que los cambios se vean reflejados.

De esta manera damos consistencia al estado de la aplicación y mantenemos la aplicación amigable.

Hasta la próxima.

Llamar un activity de pagina web.

publicado a la‎(s)‎ 14 oct. 2009 23:50 por Adrian Barajas   [ actualizado el 3 nov. 2012 12:10 ]

Una función muy utilizada es mandar llamar un Activity que contenga un web browser para visualizar una pagina web especifica en la red o cargar una pagina estática incluida en nuestra misma aplicación.

Existen dos maneras de implementar esta funcionalidad, la primera es mandar llamar un Intent y solicitar una aplicación que soporte el servicio, esto se ejecuta fuera del activity actual. La segunda opción es implementar en nuestra misma aplicación un Activity que soporte la visualización de la pagina Web. En esta ocasión mostraremos el segundo método.

En nuestro ejemplo cargaremos una pagina estática incluida en nuestra misma aplicación en este caso es la pagina de ayuda de la aplicación.

Los elementos que vamos a requerir para implementar la funcionalidad indicada son : 
  • Definición de la interface para mostrar la página.
  • Una clase que controle la carga de la interface y la iteracción con la misma.
  • Llamada en alguna parte de un menú para solicitar la carga de la página.
  • Una pagina a cargar en este caso mostraremos una página local, pero se puede integrar una URL en la web.
Primero necesitamos definir el layout correspondiente de la interface para contener nuestro elemento para visualización del pagina web. Lo llamaremos webmain.xml

<?xml version="1.0" encoding="utf-8"?>
<WebView  xmlns:android="http://schemas.android.com/apk/res/android"    
 android:id="@+id/webview"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
/>
  
En la interface integraremos el componente webwiew para visualizar la pagina correspondiente, y le asignaremos el id webview.

Para implementa la funcionalidad, en alguna parte del código integramos la llamada para cargar el Activity correspondiente.

intent = new Intent(act,MainWebView.class);
     intent.putExtra("URL","file:///android_asset/html/about.htm" ); 
     act.startActivity(intent);
    
La pagina a cargar se encuentra incluida dentro del proyecto en el apartado de assets y como subcarpeta html.

El siguiente paso es definir la clase de control de interface mediante un activity que cargue el layout correspondiente y la posterior carga de la pagina.

Mediante la case MainWebView.java implementaremos la clase de control la cual se muestra abajo.

package com.caleradreams.financalc;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import com.caleradreams.financalc.R;

public class MainWebView extends Activity {
WebView mwebview;
static final String KEY_URL = "URL";
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.webmain);

   // Get url
   Bundle extras = getIntent().getExtras();
   String url    = extras.getString(KEY_URL);
   if (url != ""){
   mwebview = (WebView) findViewById(R.id.webview);
   mwebview.getSettings().setJavaScriptEnabled(true);
   mwebview.loadUrl(url);
   }
}

}

mediante getExtras, obtenemos el parámetro de la URL a cargar. Obtenemos el componente webView, 
de este ejecutamos loadUrl, que cargará finalmente la pagina web.

Hay que recordar que para utilizar este componente es necesario asignar el permiso correspondiente en el manifiesto (AndroidManifiest.xml)

Se agrega el activity y se asigna el permiso para acceso a Internet.

<activity android:name="com.caleradreams.financalc.MainWebView"
                  android:label="WebView"
                  android:launchMode="singleTask"
                  android:theme="@android:style/Theme.NoTitleBar">                  
            <intent-filter>                
                <category android:name="android.intent.category.LAUNCHER"/>                          
            </intent-filter>
        </activity>

Con la siguiente línea se otorga el permiso a Internet.

<uses-permission android:name="android.permission.INTERNET" />


Este método se puede extender para cargar paginas en internet , ya que se puede pasar como parámetro una URL en particular.

Hasta la próxima.



1-2 of 2

Comments