IT_Programming/Android_Java

[펌][android]WebView history stack & back / Android WebView Back & Forward 버튼으로 도달할 URL 확인

JJun ™ 2018. 7. 20. 23:49



 * 출처

 : https://aggapple.tistory.com/14

 : https://lovemewithoutall.github.io/it/android-webview-history/

 : https://kutar37.tistory.com/entry/Android-webView-뒤로가기-제어





[android]WebView history stack & back

WebView 사용 시 history가 누적되었을 경우, 


Back을 눌렀을 때 WebView가 띄워진 Activity를 바로 종료하지 않고


WebView의 첫 화면으로 돌아간 후 다시 Back을 누르면 Activity를 종료(Back의 원래 기능).


해당 기능 구현을 위해 onBackPressed를 Override.


@Override
public void onBackPressed() {
// 누적된 history를 저장할 변수
WebBackForwardList list = mWebView.copyBackForwardList();
if (list.getCurrentIndex() <= 0 && !mWebView.canGoBack()) {
// 처음 들어온 페이지이거나, history가 없는경우
super.onBackPressed();
} else {
// history가 있는 경우
// 현재 페이지로 부터 history 수 만큼 뒷 페이지로 이동
mWebView.goBackOrForward(-(list.getCurrentIndex()));
// history 삭제
mWebView.clearHistory();
}
}







Android WebView Back & Forward 버튼으로 도달할 URL 확인



Android에서 WebView로 앱을 개발하다보면 Back 버튼과 Forward 버튼이 신경쓰인다. 이 버튼들을 눌렀을 때 도달할 URL이 민감한(?) 화면일 수 있기 때문. 그래서 URL을 확인할 수 있는 방법을 정리해보았다.

import android.webkit.WebView;
import android.webkit.WebBackForwardList;
// WebView
WebView wv = (WebView) findViewById(R.id.webview);
// history list
WebBackForwardList historyList = wv.copyBackForwardList();
// Back button URL
String backTargetUrl = historyList.getItemAtIndex(historyList.getCurrentIndex() - 1).getUrl();
// Forward button URL
String forwardTargetUrl = historyList.getItemAtIndex(historyList.getCurrentIndex() + 1).getUrl();

위 API를 사용하여 얻은 URL을 기준으로 필요한 로직을 구현하면 될 것이다.

끝!


참고

copyBackForwardList

WebBackForwardList

WebHistoryItem






Android : webView 뒤로가기 제어


...

HOME

물론 앱을 처음 실행시켜 들어왔다면 위 메서드가 잘 작동한다. 
그러나 웹뷰 내에서 'Home으로', 'Logout' 등의 기능으로 다른 페이지에서 곧바로 메인페이지로 넘어왔을 때 
canGoBack()이 여전히 true를 반환하므로 메인페이지에서 다시 이전 페이지로 되돌아가 버린다. 


어떠한 조건이든 웹뷰 내 첫페이지에서는 goBack() 메서드가 아니라 앱 종료를 시키고 싶다면 
webView.getOriginalUrl() 를 사용할 수 있다. 웹뷰의 현재 URL을 string으로 반환해주는 메서드다. 
(webView.getUrl()을 사용해도 무방.)
1
2
3
4
5
6
7
8
9
10
@Override
public void onBackPressed() {
    if (webView.getOriginalUrl().equalsIgnoreCase(URL)) {
        super.onBackPressed();
    }else if(webView.canGoBack()){
        webView.goBack();
    }else{
        super.onBackPressed();
    }
}
cs

위의 equalsIgnoreCase() 는 equals()와 비슷하지만 대소문자를 무시하고 비교해 준다.

...



추가: 

앱을 운영중 자꾸 이 부분에서 nullPointerException이 발생해서 webView에 if(webView!=null) 조건을 달아주었는데,
패치 후 테스트하다 보니 webView의 문제가 아니라 getOriginalUrl()에서 null이 리턴된다.

아래와 같은 글을 찾았다. 

"public String getUrl () gets the URL for the current page. This is not always the same as the URL passed to WebViewClient.onPageStarted because although the load for that URL has begun, the current page may not have changed." (c) Android Developers

그래서 onPageFinished 메소드를 오버라이드해서 해결했다.
테스트하는 기기들이 빨라서 미처 몰랐다 ...