Je vais avoir du mal à appeler loadUrl()
sur le WebView
attaché à mon Activity
du plus profond de la classe GestureDetector
, mais je ne sais pas comment passer le message vers le haut.Message Passing (LoadURL) de GestureDetector à WebView sur Android
Fondamentalement ce qui se passe est dans le rappel onFling
, je veux faire un loadUrl()
, mais l'appel ne fonctionne pas. Mon application se charge parfaitement et affiche la première page, mais lors d'un événement de lancement, elle ne charge pas une nouvelle page bien que les grille-pain s'affichent correctement.
Toute aide serait grandement appréciée!
package com.szuhanchang.friar;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class Friar extends Activity {
final String BASE_URL = "file:///android_asset/book/";
final String MIME_TYPE = "text/html";
final String ENCODING = "utf-8";
FriarWebView webView;
List<String> htmlFiles;
int currentPage = 0;
int totalPages = 0;
GestureDetector gestureDetector;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
System.out.println("onCreate!");
super.onCreate(savedInstanceState);
htmlFiles = loadBook();
totalPages = htmlFiles.size();
webView = new FriarWebView(this);
setContentView(webView);
webView.setWebViewClient(new FriarWebViewClient());
final WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(false);
webView.loadUrl(BASE_URL + htmlFiles.get(currentPage));
System.out.println(BASE_URL + htmlFiles.get(currentPage));
}
// Handle Android physical back button.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
private List<String> loadBook() {
List<String> htmlFiles = new ArrayList<String>();
try {
String[] files = getAssets().list("book");
for (String file : files) {
if (file.endsWith(".html")) {
htmlFiles.add(file);
}
}
} catch (IOException e) {
e.printStackTrace();
}
Collections.sort(htmlFiles, new AlphanumComparator());
return htmlFiles;
}
public WebView getWebView() {
return webView;
}
class FriarWebView extends WebView {
Context context;
GestureDetector gd;
public FriarWebView(Context context) {
super(context);
this.context = context;
FriarGestureDetector fgd = new FriarGestureDetector();
gd = new GestureDetector(context, fgd);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return gd.onTouchEvent(event) || super.onTouchEvent(event);
}
class FriarGestureDetector extends GestureDetector.SimpleOnGestureListener {
private int swipe_Min_Distance = 100;
private int swipe_Max_Distance = 350;
private int swipe_Min_Velocity = 100;
private void show_toast(final String text) {
Toast t = Toast.makeText(context, text, Toast.LENGTH_SHORT);
t.show();
System.out.println(text);
}
private void showUrl(int pageNum) {
assert pageNum >= 0 && pageNum < totalPages;
String filename = htmlFiles.get(pageNum);
String url = BASE_URL + filename;
getWebView().loadUrl(url);
getWebView().reload();
show_toast(url + ", " + currentPage);
}
@Override
public boolean onDown(MotionEvent event) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
final float xDistance = Math.abs(e1.getX() - e2.getX());
final float yDistance = Math.abs(e1.getY() - e2.getY());
if (xDistance > this.swipe_Max_Distance || yDistance > this.swipe_Max_Distance) {
return false;
}
velocityX = Math.abs(velocityX);
velocityY = Math.abs(velocityY);
if (velocityX > this.swipe_Min_Velocity && xDistance > this.swipe_Min_Distance) {
if (e1.getX() > e2.getX()) { // right to left
show_toast("Swipe Left");
if (currentPage + 1 > totalPages) {
show_toast("This is the last page of the book.");
}
else {
showUrl(++currentPage);
}
}
else {
show_toast("Swipe Right");
if (currentPage - 1 < 0) {
show_toast("This is the first page of the book.");
}
else {
showUrl(--currentPage);
}
}
setContentView(webView);
return true;
}
return false;
}
}
}
class FriarWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
try {
URI uri = new URI(url);
String[] segments = uri.getPath().split("/");
String filename = segments[segments.length - 1];
if (filename.contains("-")) {
currentPage = Integer.parseInt(filename.substring(0, filename.indexOf("-")));
} else {
currentPage = Integer.parseInt(filename.substring(0, filename.indexOf(".")));
}
} catch (URISyntaxException e) {
e.printStackTrace();
}
System.out.println(currentPage + " " + url);
}
}
}