2013-05-28 3 views
13

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

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

How to control the Android WebView history/back stack?

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

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

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

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

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

+0

Вы можете посмотреть, как это делает браузер Android. https://code.google.com/p/android-source-browsing/source/browse?repo=platform--packages--apps--browser#git%2Fsrc%2Fcom%2Fandroid%2Fbrowser Но это целое много кода. Я предполагаю, что это где-то в 'BrowserActivity.java' или' Controller.java'. –

+0

http://stackoverflow.com/a/24189935/2620328 – sihrc

ответ

8

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

По существу, всякий раз, когда новый 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); 
    } 
} 
+0

не работает для моего onBackPressed() ..Мне нужно дважды щелкнуть, чтобы вернуться на предыдущую страницу. –

2

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

По существу установлено, что ключ заключается в том, как вы переопределяете метод shouldOverrideUrlLoading. Так как я хотел мое приложение обрабатывает некоторые из URLs и WebView для обработки некоторых из тех, что особенно задняя handling.I использовала флаг для спины давит что-то вроде ..

@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 после завершения загрузки страницы. Надеюсь, что это поможет!

+0

не работает для меня .. –

Смежные вопросы