Подтвердить что ты не робот

История просмотра WebView без перенаправления

Я реализовал андроидный веб-просмотр и метод onKeyDown для обратного ключа. (Он реализует webview.goBack();)

Моя проблема точно подобна вопросу в этом сообщении ниже (нет ответов там)

Как управлять стеком истории Android/назад?

ПРОБЛЕМА. Когда я нажимаю кнопку "Назад", webview выбирает предыдущий URL-адрес, но если этот URL-адрес был фактически перенаправлен, он переходит в этот порочный цикл/цикл. Если вы посмотрите на браузер Chrome или броузер, он правильно обрабатывает спину, не возвращаясь к переадресации.

Как это можно решить?

Пример: перейдите в gap.com. Затем выберите "My Gap Credit Card". Это открывает ссылку перенаправления, а затем последнюю страницу. Теперь, когда я нажимаю назад, он никогда не попадает на домашнюю страницу Gap.com.

Любые предложения...

Дополнительная информация: Я реализовал shouldOverrideUrlLoading. Если я удалю этот метод, он работает нормально, но с этим методом он не...

4b9b3361

Ответ 1

Я только что проверил это на желе и, похоже, сработал.

По существу, всякий раз, когда новый URL-адрес загружается в WebView, сохраняйте копию URL-адреса.

В следующем запросе URL дважды проверьте, что они еще не на этой странице, если они есть, а затем вернитесь в историю веб-просмотра еще на один шаг.

По сути, это полагается на 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);
    }
}

Ответ 2

Я надеюсь, что этот ответ, если кто-то все еще ищет его. Я пытался найти похожие проблемы в своем проекте и пытался использовать несколько подходов, таких как использование - WebView.HitTestResult - Нажатие URL-адресов в список - onKeyDown и так далее... Я думаю, что большая часть этого будет работать, если ваше приложение состоит только из веб-браузера. Но мой проект имел комбинацию native и webview и обрабатывал некоторую собственную схему.

По существу установлено, что ключ - это то, как вы переопределяете метод shouldOverrideUrlLoading. Так как я хотел, чтобы мое приложение обрабатывало некоторые 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 и, следовательно, высмеивает поведение веб-представления. В то же время вы убедитесь, что для параметра isBackPressed установлено значение false после завершения загрузки страницы. Надеюсь, это поможет!