안드로이드 웹앱 개발시 저것또한 복붙으로 작성했는데 설정차이가 좀 있었다.
어느동작이 안됐을때 어디서 잘못된건지 쵸큼은...쵸큼은...알 수 있어졌....을걸?
- WebChromeClient로 전체 화면 지원 사용 설정. 이 클래스는 WebView가 창을 만들거나 닫고 자바스크립트 대화상자를 사용자에게 전송하는 등 호스트 앱의 UI를 변경하기 위한 권한을 필요로 할 때도 호출됩니다. 이 같은 상황에서 디버깅하는 방법을 자세히 알아보려면 웹 앱 디버깅을 참조하세요.
- WebViewClient를 사용한 탐색 오류 또는 양식 제출 오류 등 콘텐츠 렌더링에 영향을 미치는 이벤트 처리. 이 서브클래스를 사용하여 URL 로드를 가로챌 수도 있습니다.
- WebSettings를 수정하여 자바스크립트 사용 설정.
WebViewClient / WebChromeClient
비슷해보이지만 그냥 단순하게 생각하기로
웹 뷰 라고 하는건 말그대로 웹페이지를 보여주는 뷰를 제어하는거고
웹 크롬! 이들어간건 웹에서 앱의 동작을 제어하려는건가보다 하는 것으로 이해하기로했다.
틀려도 그냥 난 이렇게 이해할거당 멜렁멜롱 아몰랑
val myWebView: WebView = findViewById(R.id.webview)
myWebView.webViewClient = WebViewClient()
-> 웹페이지에서 url 이 로딩 될때 사용자가 클릭한 링크를 열려면 setWebViewClient()를 사용하여 WebView에 WebViewClient를 제공합니다.
그런데 가끔 url을 임의적으로 이동 시켜야 할 순간이 있다.
예를 들어 다른 앱을 실행하려고 링크를 넘겼을때 앱이없는경우 플레이스토어로 이동해야 하거나, 일부 url 이 로드되었을 경우 토스트메시지를 띄운다거나 하는 등의 가로채기
그런경우 shouldOverrideUrlLoading 함수를 이용하여 url 을 가로챌 수 있다.
상황에 맞게 커스텀 가능하당
private class MyWebViewClient : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
if (Uri.parse(url).host == "www.example.com") {
// url이 일치하는 경우 메서드는 URL 로드를 재정의하지 않도록 false를 반환
return false
}
// 일치하지 않는경우 기본 웹브라우저를 통하여 url 로드하도록 동작
Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
startActivity(this)
}
return true
}
}
-> Intent.ACTION_VIEW 를 사용하여 기본 웹브라우저로 넘겨 주고 있음.
웹뷰 뒤로가기
안드로이드 기기는 뒤로가기 버튼이 있당 (난 아이폰쓰는데)
그래서 뒤로가기 눌렀을 때 뒤의 웹페이지가 있는지 탐색을 한 후에 뒤로가기 처리를 해주고 있음
히스토리 관리도 가능!
가장 간단하개 canGoBack 함수를 사용
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
// 뒤로가기 버튼을 눌렀을때 히스토리가 있다면 뒤로 가세용
if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) {
myWebView.goBack()
return true
}
// 만약 히스토리가 없는 경우 아무 동작 하지 않음
return super.onKeyDown(keyCode, event)
}
뒤로가기두번 앱 종료
히스토리를 다 지나고 지나고 첫페이지로 왔을때 이제 앱 꺼졍!
방법은 다양하지만 예전부터 쓰던 소스 복붙
/**
* 키패드 누름 시간 변수
*/
private var backKeyPressedTime: Long = 0
/**
* 앱 종료 인터벌 변수
*/
private val QUIT_INTERVAL: Int = 2000
/**
* 백버튼 이벤트 처리
*/
override fun onBackPressed() {
if(mWebView.canGoBack()){
mWebView.goBack()
}else{
if (System.currentTimeMillis() > backKeyPressedTime + QUIT_INTERVAL) {
backKeyPressedTime = System.currentTimeMillis()
Toast.makeText(this, "한번 더 누르시면 종료 됩니다.", Toast.LENGTH_LONG).show()
return
}
if (System.currentTimeMillis() <= backKeyPressedTime + QUIT_INTERVAL) {
finishAffinity()
}
}
}
canGoBack 할 수 있다면 고백하지만 더이상 백으로 갈 수 없는 경우 종료 되는 상황
약간의 시간차를 두고 동작하게끔 인터벌 변수를 따로 사용
웹뷰 히스토리 알아내기
내가 이동했던 히스토리를 알아보기 위해. 전페이지가 뭐였는지 히스토리를 확인 할 수가 있다
웹에서 방문기록 확인하는 것 처럼
var historyList = webView.copyBackForwardList()
var backTargetUrl = historyList.getItemAtIndex(historyList.currentIndex() - 1).getUrl()
index 를 활용하여 전페이지 전전페이지 등을 확인 할 수 있다.
만약 현재 떠있는 페이지를 알아내고 싶다면 뒤에 상수를 지우면된다.
currentIndex() 까지만!
가끔 같은 페이지가 중복으로 로드되길래 히스토리 알아내서 같은 주소는 두번 로드되지 않도록 막아놨었음
댓글