2011-09-18 13 views
5

Como estoy seguro de que todos ustedes saben. La configuración de una WebView es una cuestión de crear un cliente de navegador webview, establecer propiedades y cargar un recurso en el cliente del navegador. He creado varias aplicaciones de Android que hacen exactamente eso.Buscando Android ViewFlipper Ejemplo con múltiples WebViews

Lo que quiero probar ahora es deslizar horizontalmente diferentes recursos web. Imagine una página de inicio principal en una url, una página de categorías en otra url y una página de búsqueda en otra url. Me gustaría crear una construcción UI que permita deslizar desde la vista principal de la página principal a una vista que muestre la URL de las categorías y luego deslizar otra vez que muestra la vista con el recurso de búsqueda (piense en la nueva interfaz de usuario del mercado Android - deslice hacia la izquierda muestra categorías) .

he leído en ViewFlipper y varios puestos aquí, pero no soy capaz de encontrar un ejemplo completo de cómo integrar la creación de instancias del navegador con vista al voltear/deslizar.

Pregunta: ¿Alguien puede proporcionar un ejemplo que puede realizar alguna variación de lo anterior y/o proporcionar un enlace a un ejemplo que muestre la instanciación del navegador con la vista web al pasar/deslizar.

dude en corregir mi aplicación sugerida ... puede haber una mejor manera de hacer esto que no he considerado aún ...

Respuesta

15

Bueno, he trabajado en esto durante algún tiempo y yo tener una solución que funcione No estoy seguro de que sea la solución más efectiva, pero seguí investigando y escribiendo código hasta que descubrí algo que tenía sentido. Con el siguiente código, tengo que dar un gran saludo a Android & Amir al http://android-journey.blogspot.com/2010/01/android-webview.html por ayudarme a resolver esto. Él tiene algunas cosas geniales y todos ustedes deberían echarle un vistazo.

El primer paso es crear una clase en su paquete de actividades llamado SimpleGestureFilter y usar el código found here. Esto viene directamente de Amir y simplifica dramáticamente las interacciones de gestos para deslizar.

El siguiente paso es usar ViewFlipper para su diseño. Estaba usando botones y varias otras cosas, por lo que hay más en este archivo de diseño de lo necesario, pero debe obtener la imagen.

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingTop="5dp"> 
    <Button 
     android:id="@+id/cat_btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Categories" /> 
    <Button 
     android:id="@+id/home_btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Home" /> 
    <Button 
     android:id="@+id/search_btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Search" /> 
</LinearLayout> 
    <ViewFlipper 
     android:id="@+id/flipview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    <WebView 
     android:id="@+id/mainview" 
     android:layout_height="fill_parent" 
     android:layout_width="fill_parent" /> 
    <WebView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/catview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
    <WebView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/searchview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
    </ViewFlipper> 
</LinearLayout> 

Como puede ver, el xml describe un diseño lineal que contiene un ViewFlipper. En la aleta de vista hay tres WebViews.

El paso final es la actividad ...

package example.swipetest; 

// import Amir's SimpleGestureFilter 
import example.swipetest.SimpleGestureFilter; 
import example.swipetest.SimpleGestureFilter.SimpleGestureListener; 

// import other required packages 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.Button; 
import android.widget.ViewFlipper; 

// class implements Amir's Swipe Listener 
public class SwipeTest extends Activity implements SimpleGestureListener { 

    // handler for JS interface 
    private Handler handler = new Handler(); 

    // all the webviews to be loaded 
    private WebView mainView; 
    private WebView catView; 
    private WebView searchView; 

    // the viewflipper 
    private ViewFlipper flipview; 

    // buttons 
    private Button cat_btn; 
    private Button home_btn; 
    private Button search_btn; 

    // progress dialog 
    private ProgressDialog progressDialog; 

    // animations 
    private Animation slideLeftIn; 
    private Animation slideLeftOut; 
    private Animation slideRightIn; 
    private Animation slideRightOut; 

    // the activity 
    final Activity activity = this; 

    // gesture filter 
    private SimpleGestureFilter filter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // set the main webview to the layout item 
     mainView = (WebView) findViewById(R.id.mainview); 

     // buttons 
     cat_btn = (Button) findViewById(R.id.cat_btn); 
     home_btn = (Button) findViewById(R.id.home_btn); 
     search_btn = (Button) findViewById(R.id.search_btn); 

     // set the client settings 
     mainView = _clientSettings(mainView); 

     // set the flipper 
     flipview = (ViewFlipper) findViewById(R.id.flipview); 

     // set onclick listeners for the buttons 
     cat_btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       _flipView(cat_btn); 
      } 
     }); 
     home_btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       _flipView(home_btn); 
      } 
     }); 
     search_btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       _flipView(search_btn); 
      } 
     }); 

     // these animations came from the sdk. they are xml files loaded 
     // into the res folder into a folder called anim 
     slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_in_left); 
     slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_out_left); 
     slideRightIn = AnimationUtils.loadAnimation(this, R.anim.slide_in_right); 
     slideRightOut = AnimationUtils.loadAnimation(this, R.anim.slide_out_right); 

     // listen for gestures 
     this.filter = new SimpleGestureFilter(this, this); 
     this.filter.setMode(SimpleGestureFilter.MODE_TRANSPARENT); 

     // load the html resource into the main view 
     mainView.loadUrl("file:///android_asset/test1.html"); 
     // set the client 
     mainView.setWebViewClient(new BasicWebViewCient()); 
     // run async to load the other web resources into the views 
     new ManageViews().execute(); 
    } 

    // use a method to manage button clicks 
private Boolean _flipView(Button button) { 
    // Handle item selection 
    switch (button.getId()) { 
    case R.id.cat_btn: 
     _setCategories(); 
     return true; 
    case R.id.home_btn: 
     _setHome(); 
     return true; 
    case R.id.search_btn: 
     _setSearch(); 
     return true; 
    default: 
     return false; 
    } 
} 

    // adding client settings to the webviews 
    // I did this way so that I could set the same settings 
    // to all of the webviews 
private WebView _clientSettings(WebView view) { 
    view.getSettings().setJavaScriptEnabled(true); 
    view.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
    view.addJavascriptInterface(new PanelJSI(), "interface"); 
    return view; 
} 

// Web view client 
private class BasicWebViewCient extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 

    @Override 
    public void onLoadResource(WebView view, String url) { 
     if (progressDialog == null) { 
      progressDialog = new ProgressDialog(activity); 
      progressDialog.setMessage("Locating"); 
      progressDialog.show(); 
     } 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     if (progressDialog.isShowing()) { 
      progressDialog.dismiss(); 
     } 
    } 
} 

// Async to load the rest of the web resources into the webviews 
private class ManageViews extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... args) { 
        // cat view will load a categories webview 
     catView = (WebView) findViewById(R.id.catview); 
     catView = _clientSettings(catView); 
     catView.loadUrl("file:///android_asset/test2.html"); 
     catView.setWebViewClient(new BasicWebViewCient()); 

        // load a search resource 
     searchView = (WebView) findViewById(R.id.searchview); 
     searchView = _clientSettings(searchView); 
     searchView.loadUrl("file:///android_asset/test3.html"); 
     searchView.setWebViewClient(new BasicWebViewCient()); 

     return null; 
    } 
} 

    // a method to manage the animation of the categories view 
private void _setCategories() { 
    if (flipview.getDisplayedChild() != 1) { 
     flipview.setInAnimation(slideLeftIn); 
     flipview.setOutAnimation(slideRightOut); 
     flipview.setDisplayedChild(1); 
    } 
} 

    // a method to manage the "center" view called home 
private void _setHome() { 
    if (flipview.getDisplayedChild() != 0) { 
     if (flipview.getDisplayedChild() == 1) { 
      flipview.setInAnimation(slideRightIn); 
      flipview.setOutAnimation(slideLeftOut); 
     } else if (flipview.getDisplayedChild() == 2) { 
      flipview.setInAnimation(slideLeftIn); 
      flipview.setOutAnimation(slideRightOut); 
     } 
     flipview.setDisplayedChild(0); 
    } 
} 

    // a method to handle the "right side" called search  
private void _setSearch() { 
    if (flipview.getDisplayedChild() != 2) { 
     flipview.setInAnimation(slideRightIn); 
     flipview.setOutAnimation(slideLeftOut); 
     flipview.setDisplayedChild(2); 
    } 
} 

    // javascript interface 
final class PanelJSI { 

    public void setView(final String shift) { 
     handler.post(new Runnable() { 
      public void run() { 
       if (shift.equals("categories")) { 
        _setCategories(); 
       } else if (shift.equals("home")) { 
        _setHome(); 
       } else { 
        _setSearch(); 
       } 
      } 
     }); 
    } 
} 

    // override the dispatch 
@Override 
public boolean dispatchTouchEvent(MotionEvent me) { 
    this.filter.onTouchEvent(me); 
    return super.dispatchTouchEvent(me); 
} 

    // manage swipe animations 
@Override 
public void onSwipe(int direction) { 

    switch (direction) { 

    case SimpleGestureFilter.SWIPE_RIGHT: 
     if (flipview.getDisplayedChild() == 0) { 
      _setCategories(); 
     } else if (flipview.getDisplayedChild() == 2) { 
      _setHome(); 
     } 
     break; 
    case SimpleGestureFilter.SWIPE_LEFT: 
     if (flipview.getDisplayedChild() == 1) { 
      _setHome(); 
     } else if (flipview.getDisplayedChild() == 0) { 
      _setSearch(); 
     } 
     break; 
    case SimpleGestureFilter.SWIPE_DOWN: 
    case SimpleGestureFilter.SWIPE_UP: 

    } 
} 

    // manage double tap 
@Override 
public void onDoubleTap() {} 
} 

Entonces ... El patrón básico que se me ocurrió es utilizar una sola configuración del cliente Web y el explorador. Utilizo el método onCreate para cargar las vistas, establezco la primera vista y luego un método Async para cargar las otras vistas después de cargar la vista principal. Entonces, dos de las vistas se cargan en segundo plano. Yo uso los patrones que Amir pasó para administrar el deslizamiento. Uso botones e interfaces JS para invocar las mismas animaciones en los clics.

El resultado final es deslizar y hacer clic en animaciones para vistas de web ViewFlipping similares a la interfaz de usuario que verá en la nueva interfaz de usuario del mercado de Android. No dude en recomendar cualquier implementación adicional que pueda fortalecer este patrón.

+0

@ jroot.Zen Gran trabajo en este tema .. –

Cuestiones relacionadas