(참고) 제가 작성하는 android studio의 기준은
Chipmunk 2021.2.1 Patch 1 입니다.
이번에 바인딩과 웹뷰를 사용하기위한 예제로 다른분의 코드를 참고하여 구글 검색 앱을 만들어보았습니다.
개발환경
build 참고
plugins {
id 'com.android.application' version '7.2.1' apply false
id 'com.android.library' version '7.2.1' apply false
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}
...
android {
compileSdk 32
defaultConfig {
applicationId "com.example.myapp"
minSdk 26
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
viewBinding {
enabled = true
}
}
activity_main.xml
<?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"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="350dp"
android:layout_height="400dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.488"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.254">
<WebView
android:id="@+id/webView"
android:layout_width="350dp"
android:layout_height="400dp">
</WebView>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
<EditText
android:id="@+id/searchView"
android:layout_width="220dp"
android:layout_height="40dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.064"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/frameLayout"
app:layout_constraintVertical_bias="0.294" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="검색"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.968"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/frameLayout"
app:layout_constraintVertical_bias="0.315" />
</androidx.constraintlayout.widget.ConstraintLayout>
사용한 요소들
MainActivity.kt
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Bitmap
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.KeyEvent
import android.view.View
import android.view.inputmethod.EditorInfo
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.TextView
import com.example.myapp.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private val binding by lazy {
ActivityMainBinding.inflate(layoutInflater) //바인딩 (findViewById보다 속도 빠름.)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.progressBar.visibility = View.GONE //로딩바 가리기 (공간차지 X)
initWebView() //웹뷰 초기화
/* 검색버튼 클릭시 검색*/
binding.button.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
binding.webView.loadUrl("https://www.google.co.kr/search?q="+binding.searchView.text) //구글검색시 주소 뒤에 q부터 붙여 검색
}
})
}
/* 웹뷰 초기화 */
@SuppressLint("SetJavaScriptEnabled") //javascript 사용시, XSS 경고가 뜨기 때문에 막기위해 사용.
fun initWebView() {
//1. 웹뷰클라이언트 연결(로딩 시작 / 끝 받아오기)
binding.webView.webViewClient = object : WebViewClient() {
//1) 로딩 시작
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
binding.progressBar.visibility = View.VISIBLE //로딩이 시작되면 로딩바 보이기
}
//2) 로딩 끝
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
binding.progressBar.visibility = View.GONE //로딩이 끝나면 로딩바 없애기
}
//3)외부 브라우저가 아닌 웹뷰 자체에서 url 호출
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
if (view != null && url != null) {
view.loadUrl(url)
return true
}
return false
}
}
//2. WebSetting: 웹뷰의 각종 설정을 정하기
val ws : WebSettings = binding.webView.settings
//3. 자바스크립트 사용 허가
ws.javaScriptEnabled = true
//4. 웹페이지 호출
binding.webView.loadUrl("https://www.google.co.kr")
}
/* 뒤로가기 동작 컨트롤 */
override fun onBackPressed() {
if(binding.webView.canGoBack()) { //이전페이지가 있으면
binding.webView.goBack() //이전페이지로 이동
} else {
super.onBackPressed() //없으면 앱 종료
}
}
}
결과