Android webviewとバックキーのonKeyDownメソッドを実装しました。(webview.goBack();
を実装します)
私の問題は、以下のこの投稿の質問とまったく同じです(回答はありません)
Android WebView履歴/バックスタックを制御する方法?
問題-戻るボタンを押すと、webview
は前のURLを選択しますが、そのURLが実際にリダイレクトされた場合、この悪循環/ループに入ります。 chromeまたはストックブラウザを見ると、リダイレクトに戻らずに正しく処理されます。
これはどのように解決できますか?
例:gap.comにアクセスします。次に、「マイギャップクレジットカード」を選択します。これにより、リダイレクトリンクが開き、最後のページが開きます。クリックして戻ると、Gap.comのホームページに移動しません。
助言がありますか...
追加情報:私はshouldOverrideUrlLoading
を実装しました。そのメソッドを削除すると、正常に機能するように見えますが、このメソッドでは機能しません...
ジェリービーンズでこれをテストしたところ、うまくいくようです。
基本的に、新しいURLがWebViewにロードされるときはいつでも、URLのコピーを保持します。
次のURLリクエストで、まだこのページに表示されていないことを再確認し、表示されている場合は、別の手順でWebビュー履歴に戻ります。
基本的に、これは、最終的なリダイレクトされたURLではなく、リダイレクトされたURLであるオーバーライドステップに渡されたURLに依存しています。
public class MainActivity extends Activity {
private Button mRefreshButton;
private WebView mWebView;
private String mCurrentUrl;
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
mRefreshButton = (Button) findViewById(R.id.refresh);
mRefreshButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mWebView.reload();
}
});
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(mCurrentUrl != null && url != null && url.equals(mCurrentUrl)) {
mWebView.goBack();
return true;
}
view.loadUrl(url);
mCurrentUrl = url;
return true;
}
});
mWebView.loadUrl("http://www.gap.com/");
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN) {
switch(keyCode) {
case KeyEvent.KEYCODE_BACK:
if(mWebView.canGoBack()){
mWebView.goBack();
return true;
}
break;
}
}
return super.onKeyDown(keyCode, event);
}
}
誰かがまだそれを探しているなら、私はこの答えを願っています。私は私のプロジェクトで同様の問題を修正するために探していて、-WebView.HitTestResult-URLをリストにプッシュする-onKeyDownなどを使用するなどの複数のアプローチを試しました...私アプリがWebビューだけで構成されていれば、ほとんどが機能すると思います。しかし、私のプロジェクトにはネイティブとWebビューの組み合わせがあり、いくつかのネイティブスキーマを処理します。
基本的に重要なのは、メソッドshouldOverrideUrlLoadingをオーバーライドする方法です。私のアプリがいくつかのURLを処理し、Webビューが他のいくつかのURL、特にバックハンドリングを処理するようにしたかったので、バックプレスにフラグを使用しました。
@Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mClient.setIsBackPressed(true);
//mClient is an instance of the MyWebviewClient
mWebView.goBack();
} else {
super.onBackPressed();
}
}
public class MyWebviewClient extends WebViewClient {
private Boolean isBackPressed = false;
public void setIsBackPressed(Boolean isBackPressed) {
this.isBackPressed = isBackPressed;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (isBackPressed){
return false;
}
else {
// handle the url by implementing your logic
return true;
}
}
@Override
public void onPageFinished(WebView view, String url) {
isBackPressed = false;
super.onPageFinished(view, url);
}
}
このように、クリックして戻るときにリダイレクトがあると、falseが返されるため、Webビューの動作が模倣されます。同時に、ページの読み込みが完了した後、isBackPressedがfalseに設定されていることを確認します。お役に立てれば !!