반응형
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<FrameLayout
android:id="@+id/toolBarLy"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
app:layout_scrollFlags="scroll|enterAlways">
<ImageButton
android:id="@+id/backBtn"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center_vertical"
android:background="?android:attr/selectableItemBackground"
android:scaleType="centerInside"
android:src="@drawable/left_arrow"
android:tint="@color/primary_text"
android:padding="17.0dp"/>
<TextView
android:id="@+id/topTitleText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="50dp"
android:text="@string/title"
android:textColor="@color/primary_text"
android:fontFamily="@font/bold"
android:textSize="18dp"/>
</FrameLayout>
</FrameLayout>
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
위와 같이 상단 Bar 하단에 WebView 영역이 있는 인앱 웹뷰가 구성되어 있습니다.
이럴 경우 외부 브라우저를 통해 웹뷰 접속이 아니라 인앱에서 웹뷰를 열어 현재의 앱 Context를 유지하는 것이 목적이 됩니다.
활용하는 Activity 코드에서 WebViewClient 설정을 추가해 주도록 합니다.
@SuppressLint("SetJavaScriptEnabled")
private fun initWebView(url: String) = with(binding) {
val set = webView.settings
set.javaScriptEnabled = true
set.builtInZoomControls = false
webView.settings.javaScriptCanOpenWindowsAutomatically = true
// **WebViewClient 추가 → 앱 내부에서 웹페이지 열리게 설정**
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
view.loadUrl(request.url.toString()) // 현재 WebView에서 URL 로드
return true // 외부 브라우저가 아니라 WebView에서 처리
}
}
webView.webChromeClient = object : WebChromeClient() {
override fun onProgressChanged(view: WebView, newProgress: Int) {
}
}
webView.loadUrl(url)
}
- 기본적으로 WebView는 loadUrl()이 호출하면 외부 브라우저를 기반으로 동작하는 것이 Default입니다.
- 하지만 shouldOverrideUrlLoading을 구성하면 URL을 로드할 때 외부 브라우저를 열지 않고 WebView에서 열게 설정됩니다.
- view.loadUrl(request.url.toString())을 호출하면 WebView 내부에서 처리
추가)
웹뷰를 열었는데, 특정 컨텐츠가 엑박 표시가 뜨면서 안 보일 경우, HTTP/HTTPS 접근 제한 때문일 수 있습니다.
아래 코드를 추가로 webView Settings에 적용해줍니다.
webView.settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
반응형