App의 Theme 변경
1. colors.xml 파일에 필요한 색상을 설정
2. themes.xml 파일에 style 을 생성 예전에는 style.xml
3. AndroidManifest.xml 파일에서 Activity 단위로 테마를 적용
액션 바에 보이는 텍스트 변경
strings.xml 파일에 app_name 이라는 속성에 문자열이 설정되어 있고 AndroidManifest.xml 파일의 label 속성에 app_name이 설정 되어 있습니다.
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name ="app_name">로또</string>
</resources>
지역화
언어나 국가 설정에 따라 UI 가 다르게 보여지는 것
언어2자리_국가2자리로 디렉토리를 생성해서 동일한 이름의 자원을 생성해주면 됩니다.
영어를 기본으로 하고 다른 나라나 언어를 서브로 지원
텍스트를 지역화
strings.xml 파일을 선택하고 마우스 오른쪽을 클릭합니다.
[New] - [Values Resource File] 을 선택
Locale 을 선택하고 언어나 국가를 선택하고 파일이름은 strings.xml 파일로 생성해서 만들면 됩니다.
animation
anim 이라는 디렉토리에 xml 파일 형태로 생성이 가능
게임이나 캐릭터 앱 들 처럼 화려한 애니메이션을 가지는 애플리케이션은 안드로이드 코드로 구현하는 것이 어렵습니다.
회전 처리
Activity 의 회전을 처리하고자 하면 AndroidManifest.xml 파일에
android:configChanges="orientation|keyboardHidden|screenSize" 를 설정
방향이 변경되거나 키보드가 숨겨지거나 스크린의 크기가 변경되면
onConfigurationChangeded(newConfig Configurarion) 메소드가 호출됩니다.
newConfig.orientation 을 호출하면 현재 기기의 방향을 확인 할 수 있음
회전을 지원하지 않고 특정 방향으로만 고정하고자 하는 경우는 AndroidManifest.xml 파일의 Activity 에 android:screenOrientation="portrait 또는 landscape"
방향에 따라 다른 UI를 출력하고자 할 때는 layout 디렉토리는 기본 디렉토리이고 layout-port 디렉토리를 만들면 세로방향에서의 layout 이고 layout-land 디렉토리를 만들면 가로 방향에서의 layout입니다.
scale1.xml
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:pivotX="50%"
android:pivotY="50%"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="2.0"
android:toYScale="2.0"
/>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
android:weightSum="3"
tools:context=".MainActivity">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:cardCornerRadius="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right|center_vertical"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="랜덤으로 번호 생성"
android:textSize="24sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="랜덤으로 로또 번호를 생성합니다" />
</LinearLayout>
<ImageView
android:layout_width="140dp"
android:layout_height="140dp"
app:srcCompat="@drawable/random" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:cardCornerRadius="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right|center_vertical"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="별자리로 번호 생성"
android:textSize="24sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="별자리로 로또번호를 생성합니다" />
</LinearLayout>
<ImageView
android:layout_width="140dp"
android:layout_height="140dp"
app:srcCompat="@drawable/constellation" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:cardCornerRadius="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right|center_vertical"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="이름으로 번호 생성"
android:textSize="24sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="이름으로 로또번호를 생성합니다" />
</LinearLayout>
<ImageView
android:layout_width="140dp"
android:layout_height="140dp"
app:srcCompat="@drawable/name" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
activity_name.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=".NameActivity">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.2" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.6" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toTopOf="@+id/guideline2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline1"
app:srcCompat="@drawable/name" />
<EditText
android:id="@+id/editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="32dp"
android:layout_marginStart="32dp"
android:layout_marginTop="8dp"
android:ems="10"
android:hint="이름을 입력하세요"
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline2"
app:layout_constraintVertical_bias="0.0" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<Button
android:id="@+id/goButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:text="번호생성"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline3"
app:layout_constraintStart_toStartOf="@+id/editText"
app:layout_constraintTop_toBottomOf="@+id/editText"
app:layout_constraintVertical_bias="0.0" />
<Button
android:id="@+id/backButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="뒤로가기"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/editText"
app:layout_constraintStart_toStartOf="@+id/guideline3"
app:layout_constraintTop_toBottomOf="@+id/editText"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
상태 저장 및 복원
앱이 종료 될 때 어떤 데이터를 저장해 두었다가 다시 화면에 보여질 때 그 데이터를 복원 하는 것
앱에는 환경설정을 저장하는 파일이 있어서 설정을 할 수 있습니다.
1. 상태를 저장할 수 있는 메소드를 재정의
override fun onSaveInstanceState(outState :Bundle){
super.onSaveInstanceState(outState)
outState.put자료형(key:String, 데이터)
}
2. onCreate 메소드에 작성
override fun onCreate(savedInstaceState : Bundle?){
super.onCreate(savedInstanceState)
setContentView(?)
val 변수 = savedInstanceState.get자료형(key:String)
}
앱이 종료될 때 마지막 상태나 데이터를 파일이나 서버에 저장해두고
앱이 다시 시작할 때나 보여질 때 데이터를 읽어 와서 출력하는 방법으로 직접 구현하셔도 됩니다.
MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import android.view.animation.AnimationUtils.loadAnimation
import android.widget.Button
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { // Bundle 을 이용한 저장 복원은 파일을 이용한 것과 차이가 없다.
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_name)
val goButton: Button = findViewById(R.id.goButton)
goButton.setOnClickListener(View.OnClickListener {
//anim 디렉토리에 만든 scale1.xml 파일의 애니메이션 가져오기
val anim: Animation =
AnimationUtils.loadAnimation(this, R.anim.scale1)
//버튼 자신에게 적용
it.startAnimation(anim)
})
}
}
WebView
WebSite 나 앱 내에 있는 html 파일을 출력하기 위한 뷰
외부 사이트에 접속하기 위해서는 internet 권한이 있어야 합니다.
loadUrl 이라는 메소드에 url 을 대입하면 그 url 을 출력을 합니다.
URL 이 Redirect 되는 URL 이면 내장 브라우저가 출력합니다.
WebView 의 setWebViewClient 메소드에 WebViewClient 인스턴스를 대입해주면 내장 브라우저가 아니라 WebView 가 출력 됩니다.
url 이 https 처럼 보안이 적용된 url 이 아니면 접속이 안됩니다.
AndroidManifest.xml 파일의 application 태그에 android:usesCleartextTraffic="true" 옵션을 설정해야 합니다.
WebView 를 통해서 웹사이트에 구현 된 자바 스크립트 코드를 호출하는 것이 가능 합니다.
자바 스크립트코드가 리턴한 데이터를 가져와서 사용할 수 있습니다.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lotto">
<!-- 인터넷 권한 설정 -->
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/random"
android:label="@string/app_name"
android:roundIcon="@drawable/random"
android:supportsRtl="true"
android:theme="@style/Theme.Lotto">
<activity android:name=".WebActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ResultActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".NameActivity"
android:theme="@style/AppTheme.Name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ConstellationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
웹뷰 인터넷 권한 부여
<uses-permission android:name="android.permission.INTERNET"/>
http 가능 설정
android:usesCleartextTraffic="true"
웹 뷰의 옵션을 설정
var settings = webView.settings
리다이렉트 되는 웹 사이트의 경우 크롬을 이용하지 않고 웹뷰를 이용해서 출력하도록 설정
webView.webViewClient = WebViewClient()
자바 스크립트를 사용 할 수 있도록 설정
settings.javaScriptEnabled = true
settings.builtInZoomControls = true
WebActivity.kt
package com.example.lotto
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
class WebActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_web)
val webView: WebView = findViewById(R.id.webView)
// 리다이렉트 되는 웹 사이트의 경우 크롬을 이용하지 않고 웹뷰를 이용해서 출력하도록 설정
webView.webViewClient = WebViewClient()
// 웹 뷰의 옵션을 설정
var settings = webView.settings
// 자바 스크립트를 사용 할 수 있도록 설정
settings.javaScriptEnabled = true
settings.builtInZoomControls = true
// 사이트 출력
webView.loadUrl("http://www.daum.net")
}
}
'안드로이드' 카테고리의 다른 글
안드로이드 : Thread 와 Handler / 서버 통신 (0) | 2020.11.03 |
---|---|
안드로이드 : 액티비티와 인텐트 (0) | 2020.11.02 |
안드로이드 : 목록 대화 상자 (0) | 2020.10.28 |
안드로이드 : 대화 상자 (0) | 2020.10.28 |
안드로이드 : 진동과 사운드 (0) | 2020.10.28 |