안드로이드 개발의 구성요소
화면개발(그림) + 로직개발(동작)
- 화면개발 : XML 개발
- 로직개발 : JAVA 개발
- 개발순서 : 화면개발(XML) - 로직개발(JAVA) : 단위별로 반복한다. 화면-로직 > 화면-로직 > 화면-로직 > ...
- 하나의 화면과 로직 묶음 => Activity 액티비티
- activity를 생성하면 자동으로 xml과 java 두개도 자동으로 셋팅이 된다.
- 당연히 어느 작동을 하고 싶을 때 어떤 코드를 어느 위치에 넣어야 하는지를 정하고 시작한다.
- 안드로이드스튜디오는 클라이언트 개발 프로그램이다.
- 가상환경을 설치해서 돌아가기 때문에 헤비함, 디스크 메모리 cpu 좋은 거 써야 작업이 잘 진행된다.
♠ xml파일 초기 코드는 ConstraintLayout에 담아야 한다.
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"/>
♠ 이미지는 보통 png로 만듦.
♠ 디렉토리 생성할 때 리소스 타입을 지정해 줘야 한다.
♠ sound file들은 res 디렉토리 안에 raw 폴더 만들어서 저장해 준다.
★ dp = > 뷰 화면구성할 때의 단위.
★ sp = > 글자의 크기 단위
인텐트를 포함하고 있는 액티비티를 실행하면 메인 엑티비티를 실행한다.
메인함수는 프레임워크가 가지고 있다.
안드로이드 인텐트 필터를 포함하고 있는 메인액티비티를 실행한다.
개발자가 그렇게 만들어 놓음
♠ 화면개발을 하고 인터렉션이 있는 view(각 요소)마다 ID 셋팅해줘야 한다.
app / manifests / AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.DiceApp"
tools:targetApi="30">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
manifests는 앱의 환경설정을 하는 곳이다.
empty Activity 생성 후
위와 같이 <activity> 부분만 아래와 같은 구문을 넣어 준 것이다.
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
애초에 생성할 때 Launcher Activity를 체크해주고 생성해도 된다.
app / java / com.bpdev.diceapp / MainActivity.java
package com.bpdev.diceapp;
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.daimajia.androidanimations.library.Techniques;
import com.daimajia.androidanimations.library.YoYo;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
// 화면에서 유저와 인터렉티브 되는 뷰들은 멤버변수로 만든다.
Button button;
// 장식은 안 가져와도 된다.
ImageView imgDice1;
ImageView imgDice2;
MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
imgDice1 = findViewById(R.id.imgDice1);
imgDice2 = findViewById(R.id.imgDice2);
mp = MediaPlayer.create(MainActivity.this, R.raw.dice_sound);
// 유저가 탭하는 것을 유저의 이벤트라고 한다.
// 유저가 버튼을 누르면, 작성하는 코드!
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 테스트 코드 작성!
// 로그를 찍어 보자!!
Log.i("Dice Main", "버튼 눌렸다.");
// 1. 주사위 굴리는 소리
mp.start();
// 2. 랜덤으로 숫자 2개를 가져온다.
Random random = new Random();
int num1 = random.nextInt(5+1);
int num2 = random.nextInt(5+1);
Log.i("Dice Main", "랜덤 숫자:" + num1+", "+ num2);
// 3. 해당 숫자에 맞는 주사위 이미지를 보여준다.
if (num1 == 0){
// 주사위1을 화면1에 표시한다.
imgDice1.setImageResource(R.drawable.dice1);
} else if (num1 == 1) {
// 주사위2을 화면1에 표시한다.
imgDice1.setImageResource(R.drawable.dice2);
} else if (num1 == 2) {
// 주사위3을 화면1에 표시한다.
imgDice1.setImageResource(R.drawable.dice3);
}else if (num1 == 3) {
// 주사위4을 화면1에 표시한다.
imgDice1.setImageResource(R.drawable.dice4);
}else if (num1 == 4) {
// 주사위5을 화면1에 표시한다.
imgDice1.setImageResource(R.drawable.dice5);
}else if (num1 == 6) {
// 주사위6을 화면1에 표시한다.
imgDice1.setImageResource(R.drawable.dice6);
}
if (num2 == 0){
// 주사위1을 화면1에 표시한다.
imgDice2.setImageResource(R.drawable.dice2);
} else if (num2 == 1) {
// 주사위2을 화면1에 표시한다.
imgDice2.setImageResource(R.drawable.dice2);
} else if (num2 == 2) {
// 주사위3을 화면1에 표시한다.
imgDice2.setImageResource(R.drawable.dice3);
}else if (num2 == 3) {
// 주사위4을 화면1에 표시한다.
imgDice2.setImageResource(R.drawable.dice4);
}else if (num2 == 4) {
// 주사위5을 화면1에 표시한다.
imgDice2.setImageResource(R.drawable.dice5);
}else if (num2 == 6) {
// 주사위6을 화면1에 표시한다.
imgDice2.setImageResource(R.drawable.dice6);
}
// 4. 애니메이션 효과를 준다.
YoYo.with(Techniques.Shake)
.duration(400)
.repeat(0)
.playOn(imgDice1);
YoYo.with(Techniques.Shake)
.duration(400)
.delay(10)
.repeat(0)
.playOn(imgDice2);
}
});
}
}
안드로이드에서 로그 남기는 방법
필요한 곳에서 이렇게 적어주면, 하단의 Logcat에서 확인이 가능하다.
괄호를 열고 "Dice Main"이라고 적으면 실제로는 문자열 앞에 tag : 가 자동 생성 된다.
Log.i("Dice Main", "버튼 눌렸다.");
app / res / layout / 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"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="@drawable/app_bg"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imgTop"
android:layout_width="303dp"
android:layout_height="196dp"
android:layout_marginStart="60dp"
android:layout_marginTop="96dp"
android:layout_marginEnd="60dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/top_image" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="328dp"
android:layout_marginEnd="20dp"
android:backgroundTint="#AC622F"
android:text="Roll the Dice!!"
android:textSize="22sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/imgDice2"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_marginStart="15dp"
android:layout_marginTop="110dp"
android:layout_marginEnd="55dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/imgDice1"
app:layout_constraintTop_toBottomOf="@+id/button"
app:srcCompat="@drawable/dice2" />
<ImageView
android:id="@+id/imgDice1"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_marginStart="55dp"
android:layout_marginTop="110dp"
android:layout_marginEnd="15dp"
app:layout_constraintEnd_toStartOf="@+id/imgDice2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button"
app:srcCompat="@drawable/dice1" />
</androidx.constraintlayout.widget.ConstraintLayout>
res는 각종 재료들?을 넣어두는 곳이다. res는 resources의 약자임
화면의 UI 위젯들을 액티비티에서 가져다 사용하기 위한 방법
위와 같이 android:id= "@+id/imgDice1" 식으로 id name을 설정해 준다.
이 아이디를 java에 데려와서 불러온다.
R.drawable.dice3 이런 식으로 경로 지정해주면 불러올 수 있다. R은 res를 말한다.
app / res / values / Strings.xml
<resources>
<string name="app_name">주사위 앱</string>
</resources>
앱 이름 바꾸는 방법
String.xml 파일에서는 출력되는 언어 정보들을 관리한다. 위의 코드는 앱의 이름을 '주사위 앱'으로 설정해주는 것이다.
app / Gradle Scripts / build.gradle (module :app)
plugins {
id 'com.android.application'
}
android {
namespace 'com.bpdev.diceapp'
compileSdk 33
defaultConfig {
applicationId "com.bpdev.diceapp"
minSdk 24
targetSdk 33
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
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
implementation 'com.daimajia.androidanimations:library:2.4@aar'
}
오픈소스 라이브러리를 안드로이드 스튜디오에 적용하는 방법
dependencies{ } 부분이 라이브러리 설치하는 곳이다.
중괄호 안에 implementation 'com.daimajia.androidanimations:library:2.4@aar' 같은 설치 구문을 입력하고, 화면 오른쪽 상단의 Sync now를 꼭 눌러줘야 함. 그리고나서
app / java / com.bpdev.diceapp / MainActivity.java 같이 사용할 곳에서 이런 식으로 import 시켜서 사용하면 된다.
import com.daimajia.androidanimations.library.Techniques;
import com.daimajia.androidanimations.library.YoYo;