WebView 사용하기
WebView란?
Kotlin으로 앱을 개발할 때 웹 콘텐츠를 앱 내에서 표시하기 위한 컴포넌트다. 주로 외부 웹 페이지를 표시하거나 앱 내에서 HTML, CSS 및 JavaScript로 잓
사용법
1. WebView를 보여줄 새로운 액티비티와 프래그먼트 생성
1.res/layout 하위에 ConstraintLayout을 루트 레이아웃으로 가진 레이아웃 파일 생성
2.생성한 레이아웃 파일에서 편집기 창 오른쪽 위의 디자인 버튼을 클릭해 디자인 뷰로 전환한 후 레이아웃 편집기에서 팔레트의 Widgets에 있는 WebView를 끌어서 ConstraintLayout에 넣는다.
3.속성 창에서 WebView의 네 방향 제약을 추가한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/web_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
4.패키지 마우스 우클릭 후 Kotlin class/File 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.crystal.android.photogallery
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.webkit.WebView
private const val ARG_URI = "photo_page_url"
class PhotoPageFragment: VisibleFragment() {
private lateinit var uri: Uri
private lateinit var webView: WebView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
uri = arguments?.getParcelable(ARG_URI) ?: Uri.EMPTY
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_photo_page, container, false)
webView = view.findViewById(R.id.web_view)
return view
}
companion object {
fun newInstance(uri:Uri): PhotoGalleryFragment {
return PhotoGalleryFragment().apply {
arguments = Bundle().apply {
putParcelable(ARG_URI, uri)
}
}
}
}
}
2. 생성한 프래그먼트를 호스팅하는 액티비티 생성
1.생선한 프래그먼트를 호스팅하는 Activity를 생성한다.
1
New > Activity > Empty Activity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.crystal.android.photogallery
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class PhotoPageActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_photo_page)
val fm = supportFragmentManager
val currentFragment = fm.findFragmentById(R.id.fragment_container)
if (currentFragment == null) {
val fragment = PhotoPageFragment.newInstance(intent.data!!)
fm.beginTransaction()
.add(R.id.fragment_container, fragment)
.commit()
}
}
companion object {
fun newIntent(context: Context, photoPageUri: Uri): Intent {
return Intent(context, PhotoPageActivity::class.java).apply {
data = photoPageUri
}
}
}
}
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2.위에 생성한 Activity 시작시키기
1
2
3
4
override fun onClick(view: View?) {
val intent = PhotoPageActivity.newIntent(requireContext(), galleryItem.photoPageUri)
startActivity(intent)
}
3. WebView에 사진 페이지 띄우기
1.사진을 로드하기 위한 URL을 알려주고 자바스크립트를 사용할 수 있게 해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.crystal.android.photogallery
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.webkit.WebView
import android.webkit.WebViewClient
private const val ARG_URI = "photo_page_url"
class PhotoPageFragment: VisibleFragment() {
private lateinit var uri: Uri
private lateinit var webView: WebView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
uri = arguments?.getParcelable(ARG_URI) ?: Uri.EMPTY
}
**@Suppress("SetJavaScriptEnabled")**
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_photo_page, container, false)
webView = view.findViewById(R.id.web_view)
**webView.settings.javaScriptEnabled = true
webView.webViewClient = WebViewClient()
webView.loadUrl(uri.toString())**
return view
}
companion object {
fun newInstance(uri:Uri): PhotoGalleryFragment {
return PhotoGalleryFragment().apply {
arguments = Bundle().apply {
putParcelable(ARG_URI, uri)
}
}
}
}
}
이렇게 하면 모든 설정이 완료된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.