본문 바로가기

안드로이드

안드로이드

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")
    }
}