2011-09-18 11 views
5

Come sono sicuro che tutti voi sapete. L'impostazione di una WebView consiste nel creare un client browser Webview, impostare le proprietà e caricare una risorsa nel client browser. Ho creato diverse app Android che fanno esattamente questo.Alla ricerca di ViewFlipper Android Esempio con più WebView

Quello che vorrei provare ora è lo scorrimento orizzontale di diverse risorse web. Immagina una home page principale su un URL, una pagina di categorie su un altro URL e una pagina di ricerca su un altro URL. Vorrei creare un costrutto UI che permetta di scorrere dalla vista url della home page principale a una vista che mostra l'url delle categorie e poi un altro colpo che mostra la vista con la risorsa di ricerca (pensa alla nuova interfaccia utente del mercato Android - scorri verso sinistra mostra le categorie) .

Ho letto su ViewFlipper e diversi post qui, ma non sono in grado di trovare un esempio completo di come integrare l'istanza del browser con la visualizzazione di sfogliare/scorrere.

Domanda: qualcuno può fornire un esempio che può eseguire alcune varianti di quanto sopra e/o fornire un collegamento a un esempio che mostra l'istanza del browser con la visualizzazione/sfioramento della vista Web.

Sentitevi liberi di correggere la mia realizzazione suggerito ... ci può essere un modo migliore per fare questo che non ho ancora considerato ...

risposta

15

Beh, ho lavorato su questo per un po 'di tempo e mi avere una soluzione che funzioni. Non sono sicuro che sia la soluzione più efficace, ma ho continuato a cercare e scrivere codice finché non ho capito qualcosa di sensato. Con il seguente codice ho bisogno di dare un grande grido ad Android & Amir al http://android-journey.blogspot.com/2010/01/android-webview.html per avermi aiutato a capirlo. Ha delle cose fantastiche e dovresti provarlo tutti.

Il primo passaggio consiste nel creare una classe nel pacchetto Attività denominata SimpleGestureFilter e utilizzare il codice found here. Questo viene direttamente da Amir e semplifica drasticamente le interazioni gestuali per lo scorrimento.

Il passaggio successivo consiste nell'utilizzare ViewFlipper per il layout. Stavo usando i pulsanti e molte altre cose quindi c'è più di questo file di layout del necessario, ma dovresti ottenere l'immagine.

<?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> 

Come si può vedere, il codice XML descrive un layout lineare che contiene un ViewFlipper. Nella vista flipper ci sono tre WebViews.

Il passo finale è l'attività ...

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() {} 
} 

Quindi ... Il modello di base mi è venuta è quella di utilizzare un unico impostazioni del client e del browser web. Io uso il metodo onCreate per caricare le viste, impostare la prima vista e quindi un metodo Async per caricare le altre viste dopo aver caricato la vista principale. Quindi due delle visualizzazioni vengono caricate in background. Io uso i modelli trasmessi da Amir per gestire lo swipe. Uso i pulsanti e le interfacce JS per richiamare le stesse animazioni sui clic.

Il risultato finale è animazioni di scorrimento e clic per le visualizzazioni Web ViewFlipping simili all'interfaccia utente che vedrete nella nuova interfaccia utente del mercato Android. Sentiti libero di consigliare eventuali implementazioni aggiuntive che potrebbero rendere più forte questo modello.

+0

@ jroot.Zen Grande lavoro su questo argomento .. –