이번 편에서는 레이아웃과 코틀린 코드사이의 연결에 대해서 알아보겠습니다. 레이아웃에 만들어둔 도구(컴포넌트)에 동작을 입히는 과정입니다.

 

<?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">

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:gravity="start|top"
        android:inputType="textMultiLine"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintTop_toBottomOf="@+id/editText"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        app:layout_constraintTop_toBottomOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

위와 같이 3개의 컴포넌트들을 생성해두었었지요. EditText, Button, TextView 각각의  id 는 "editText", "button", "textView"입니다.

번역기를 개발해보겠다고 하였었지요? EditText에는 번역하고자 하는 단어(예: LOVE)를 적을 것이고, Button 을 누르면 번역작업을 거쳐 TextView 에 변역된 결과(예: 사랑)가 보여지도록 할 예정입니다. 다만 번역하는 부분은 구글의 API 를 사용해야해서 다음 편에서 진행해보도록 하겠습니다.

 

1. button 에 대해서 동작을 정의하고 싶으면 아래와 같이 해주면 됩니다.

 

 

그런데 button이 빨간색으로 표시되네요. 에러가 있다는 것인데요. 마우스를 가져다대면 아래와 같은 설명이 표시됩니다. MainActivity.kt 코드에서는 button 이라는 것이 어디서 왔는지 알지 못합니다. 그래서 button이 무엇인지 어디서 왔는지 알려줄 필요가 있습니다. 그게 바로 Import 입니다. 파란 "Import"버튼을 눌러도 되고, Mac 단축키(ALT + SHIFT + ENTER) 를 입력해줘도 됩니다.

 

아래와 같이 한줄이 추가되었습니다. activity_main.xml 레이아웃 파일내의 모든(*) 컴포넌트들을 import 하겠다는 것입니다. 이제 button 코드부분의 빨간색이 사라졌네요.

 

그러면 button 이 눌렸을 때, EditText의 내용을 TextView에 작성되도록 해볼까요? 아래와 같이 작성하면 됩니다. 간단하지 않습니까. 저도 Java로 개발하다 Kotlin 접하니 이렇게 간결할수가 없습니다. 

 

Java로 개발하였다고 하면 아래와 같이 작성해주었어야 했을텐데, 확연하게 짧은 것을 알 수 있습니다. Kotlin 인정!

EditText edit = findViewById(R.id.editText);
Button btn = findViewById(R.id.button);
TextView text = findViewById(R.id.textView);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        text.setText(edit.getText());
    }
});

 

그러면 그 결과를 확인해보도록 하겠습니다. Button을 눌렀을 때, EditText의 내용이 TextView 에 잘 표시되는 것을 확인할 수 있었습니다.

 

 

다음편에서는 구글 번역 API를 이용해서 번역된 결과를 TextView에 적어보도록 하겠습니다.

감사합니다.

 

 

이번 편에서는 안드로이드 프로젝트의 기본 구성에 대해서 알아보겠습니다.

안드로이드 프로젝트는 수많은 컴포넌트들로 구성되어 있지만, 이제 갓 안드로이드에 입문하였다면 크게 2가지로 구분된다는 것을 알면됩니다. 코드 부분 그리고 레이아웃 부분입니다. 

 

1. "MainActivity.kt" 코드 부분을 간단하게 확인해보도록 하겠습니다.

 

package com.devkim.mytranslater

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

	// onCreate함수는 앱을 실행했을때 불리는 함수부분입니다.
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // activity_main.xml 레이아웃 파일을 읽어와서 화면에 적용해주는 코드입니다.
        setContentView(R.layout.activity_main)
    }
}

 

2. 그러면 "activity_main.xml" 레이아웃 부분은 어떻게 생겼는지 확인해보도록 하겠습니다. 

activity_main.xml 을 더블클릭해보면 아래와 같이 레이아웃 형태로 앱 구성을 할 수 있는 화면이 보여집니다.

 

왼쪽의 Palette에서 도구들을 끌어다가 앱을 구성할 수 있는데, 눈에 보이는 레이아웃이 어떤 코드 형태를 가지는지 확인하면서 진행하는 것이 차후 메뉴가 많아졌을때 관리가 수월하기 때문에, 코드 형태도 확인해보도록 하겠습니다. 아래 버튼을 클릭하면 코드 형태로 확인할 수 있습니다.

 

대략 ConstraintLayout 안에 TextView 가 포함되어 있다는 것을 확인할 수 있습니다.

Layout 구성 방식 중에는 LinearLayout, RelativeLayout, ConstraintLayout ... 등등 여러가지가 있습니다. 제가 이전에 안드로이드 앱 개발을 할 당시에는 LinearLayout을 베이스로 개발하였으나, 지금은 default 레이아웃이 ConstraintLayout인 만큼 ConstraintLayout만의 장점이 있을 것을 기대하며 ConstraintLayout 을 베이스로 진행해보도록 하겠습니다.

도구들은 EditText, Button, TextView, .... 를 주로 많이 사용하는데, 이를 레이아웃에 한번 배치해보겠습니다.

 

Text > Multiline Text 도구를 드래그하여 레이아웃에 올려둡니다.

(기본 EditText는 "Plain Text"를 사용하면 되지만, 번역앱을 만들어보기로 하였으니 여러줄 입력 가능한 컴포넌트를 사용하겠습니다.)

 

Button과 TextView도 각각 드래그해서 올려둡니다.

 

 

그런데 코드 에디터로 와서 확인해보니 각 도구들마다 빨간줄이 그어져 있네요 

"This view is not constrained. It only has designtime positions, so it will jump to (0,0) at runtime unless you add the constraints" 

 

각 뷰는 디자인 시점의 위치만 가지고 있고, 제약을 가하지 않으면 runtime에서 (0,0) 에 위치할 것이라고 하네요.

실제 앱을 실행해보면 모든 도구들이 (0,0)에 위치한 것을 확인할 수 있습니다.

 

아래와 같이 레이아웃을 수정해보도록 하겠습니다.

<?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">

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:gravity="start|top"
        android:inputType="textMultiLine"
        // EditText의 상단 parent의 상단과 맞춤
        app:layout_constraintTop_toTopOf="parent"
        // EditText의 시작(왼쪽)을 parent의 왼쪽과 맞춤
        app:layout_constraintStart_toStartOf="parent"
        // EditText의 끝(오른쪽)을 parent의 오른쪽과 맞춤 (좌우 각각 맞추면 가운데 정렬이 됨)
        app:layout_constraintEnd_toEndOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        // Button의 상단을 editText의 하단과 맞춤
        app:layout_constraintTop_toBottomOf="@+id/editText"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        app:layout_constraintTop_toBottomOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

아래와 같이 레이아웃 구성된 것을 확인할 수 있고, 실제 앱 실행했을 때도 이와 동일하게 구성되는 것을 확인할 수 있습니다.

 

 

 

기본적인 프로젝트 구성에 대해서 알아보았고, 다음 편에서는 각 도구들에 동작을 입히는 방법에 대해서 알아보도록 하겠습니다.

감사합니다.

 

앞 편에서는 애뮬레이터 사용법에 대해서 알아봤습니다. 애뮬레이터는 실제 기기대비 제약이 존재하기 때문에, 안드로이드 폰을 갖고있지 않은 경우만 사용하는 것을 추천합니다. 그럼 이번 편에서는 안드로이드 기기에서 앱을 실행하는 방법에 대해서 알아보겠습니다. (LG V40 기기를 기준으로 작성되었습니다.) 

 

0. 맥은 드라이버가 자동으로 설치되어 Windows처럼 드라이버를 별도로 설치해주지 않아도 됩니다.

 

1. 기기의 개발자 옵션에서 USB  디버깅 옵션을 켜주어야 합니다.

휴대폰 설정 > 휴대폰 정보 >  소프트웨어 정보

 

"빌드 번호" 메뉴를 5회 클릭해주면 휴대폰 설정의 "개발자 옵션" 메뉴가 나타납니다.

 

개발자 옵션에서 "USB 디버깅" 옵션을 체크해주면 이제부터 Mac 에서 안드로이드 폰에 개발자용 작업들을 수행할 수 있게됩니다. 

 

 

2. 안드로이드 기기 및 PC에 USB 케이블을 연결하면 해당 PC에서 USB 디버깅이 가능하도록 허용할지 확인 팝업이 발생합니다. 확인을 눌러주면 되며, 케이블 연결때마다 확인을 요청할 것이므로 "이 컴퓨터에서 항상 허용"을 체크하여 항상 허용하도록 할 수 있습니다.

 

 

3. Android Studio 에서 안드로이드 기기로의 앱 설치해보도록 하겠습니다.

안드로이드 기기가 연결되면, Android Studio 에 자동으로 "LGE LM-V409N" 과 같이 인식되어 있는 것을  확인할 수 있습니다.

애뮬레이터에서 실행하고 싶다면 "Pixel 2 API 24" 를 선택하여 변경해주면 되며, 안드로이드 기기에서 실행하고 싶다면 그대로 두고 재생버튼 눌러주면 되겠습니다.

 

아래와 같이 안드로이드 기기에 앱이 자동 설치되며 실행까지 잘되는 것 확인할 수 있습니다.

 

다음 편에서는 안드로이드 프로젝트의 간략한 설명을 진행해보도록 하겠습니다.

감사합니다.

 

프로젝트 생성 후 프로젝트 구조를 파악하기에 앞서서 애뮬레이터를 통해 앱을 실행해보는 법에 대해서 알아보겠습니다.

모바일 기기가 별도로 있으면 개발이 굉장히 수월하지만 혹시 모바일 기기가 없으면 애뮬레이터로 개발을 해야합니다. 예전에는 애뮬레이터 성능이 굉장히 쓰레기 였습니다만... 지금은 얼마나 개선되었는지 확인해보겠습니다.

 

 

아래와 같은 에러가 발생하네요...

Cannot find AVD system path. Please define ANDROID_SDK_ROOT

 

AVD Manager를 눌러봅니다.

 

AVD Manager 에서 기존 생성되어있는 virtual device 를 사용해보려고 했으나, 다운로드할 수 없었습니다. "Create Virtual Device"로 새로 생성해보겠습니다.

 

디폴트로 선택되어있는 Pixel 2를 선택하고 "Next" 눌러보겠습니다.

 

가장 API 레벨 낮은 걸로 다운로드 받아보겠습니다.

 

"Accept" 한 후 "Next" 눌러보겠습니다.

 

virtual device 다운로드가 시작되며, 완료시 "Finish"를 누르도록 하겠습니다.

 

virtual device 다운로드 완료되면 "Next" 버튼이 활성화됩니다. 클릭해보겠습니다. 

 

아래 기본 설정은 그대로 두고 "Finish" 눌러보겠습니다.

 

아래 신규 생성된 Pixel 2의 재생버튼을 눌러봅니다.

 

아래와 같이 virtual device 가 정상적으로 실행되었습니다. 심지어 1분이 걸리지 않았습니다. 옛날에 5분 이상 걸렸던 것과는 비교할 수 없을 정도의 발전이네요. 

 

 

다시 아래의 재생버튼을 눌러보겠습니다.

 

앱이 애뮬레이터에 뜨는 것을 확인할 수 있습니다. 

 

 

 

다음편에서는 안드로이드 기기에서 앱 실행하는 방법에 대해서 알아보도록 하겠습니다.

감사합니다.

 

Android Studio 에서 안드로이드 앱개발을 위해 프로젝트를 생성하는 방법을 알아보겠습니다.

 

1. Android Studio 를 실행하면 아래 화면이 발생하고 "Start a new Android Studio project" 버튼을 눌러보겠습니다.

 

 

2. 프로젝트 생성시 메인 화면이 될 Activity 의 템플릿을 선택하는 화면이 발생합니다. 개발하고자하는 앱의 형태가 이미 머리속에 있으시다면 그것과 비슷한 형태의 템플릿을 설정하면 됩니다만, 저는 일단 아무것도 없는 "Empty Activity" 로 설정해서 대략 코드가 어떻게 생겼는지 확인해보도록 하겠습니다. 

 

 

3. 프로젝트 생성을 위한 기본 정보들을 입력하는 단계입니다.

 

 

  • Name : Android Studio 내에서 이 프로젝트를 식별을 위한 이름입니다. (번역기를 개발하고자 하여 MyTranslator로 하였습니다.)

  • Package name : Play Store 내에서 이 앱을 식별하기 위한 이름이므로, 다른 앱들과 겹치지 않도록 이름을 지어주어야 합니다. 일반적으로 com.[회사이름].[서비스이름] 과 같은 형태로 지을수 있습니다. 카카오를 예로 들면, 카카오톡은 com.kakao.talk와 같고, 카카오스토리는 com.kakao.story와 같습니다.

  • Save location : 프로젝트가 생성될 경로이고, 기본 설정을 유지하면 됩니다.

  • Language : Kotlin vs Java 2가지 선택사항이 있습니다. Java는 전통적으로 안드로이드 앱 개발에 사용하던 언어이고, Kotlin은 최근 3~4년 사이 구글이 밀고 있는 언어입니다. Kotlin 은 기존 Java 대비 간결한 문법을 가지고 있고, Java의 일부 부족한 부분을 보완했다고 합니다. 구글이 밀고 있다는 점, Kotlin으로 개발된 앱의 비율이 점점 증가하고 있다는 점을 봤을 때, 결국에는 Kotlin이 대세가 되지않을까 싶습니다. Kotlin 이 항상 옳다라고 얘기할 수는 없겠지만, 계속 보완되고 발전해나갈 것이라는 것은 분명해 보입니다. 저는 Kotlin으로 선택하겠습니다.

  • Minimum SDK : 어느 버전 이상의 모바일 기기에서 사용되도록 할지 결정하는 옵션입니다. 높은 버전을 선택할 수록 신규 API 를 통해 더 고도화된 기능을 탑재할 수 있지만, 해당 버전보다 낮은 버전을 탑재한 모바일 기기에서는 다운로드를 받을 수 없게 됩니다. 저는 전세계 94%의 기기를 커버할 수 있는 API 21(Lollipop) 버전을 선택하도록 하겠습니다. 

  • Use legacy android.support libraries : 신규 OS 에 추가된 신규 API 를 사용하게되면, 이전 OS가 설치된 안드로이드 기기에서는 해당 API 를 사용할 수 없게 됩니다. 개발자는 Mashmallow 모바일 기기로 개발하여 정상동작하는 앱을 만들었더라도, Play Store에서 다운로드 받은 일부 Lollipop 기기 유저들은 앱이 정상동작하지 않을 수 있다는 것입니다. 이럴때 android.support library 를 사용하면, 신규 OS와 이전 OS 모두에서 정상동작 가능하게 support 해줍니다. 다만 아직 초급단계의 개발이라면, 이런 하위 호환성을 고려하지 않고 개발 진행해보도록 하겠습니다.

 

4. 위에서 "Finish" 버튼을 눌렀다면, 아래와 같이 실제 개발을 위한 화면이 발생하게 됩니다. 오른쪽에 "What's New" 탭은 최소화 버튼으로 최소화 해주시면 프로젝트 생성이 완료되었습니다.

 

 

다음편에서는 애뮬레이터를 통한 앱 실행법에 대해서 알아보도록 하겠습니다.

감사합니다.

 

7년전 대학 졸업 과제로 안드로이드 앱개발을 했던 이후로 꽤 오랫동안 안드로이드를 쉬다가 최근에 만들어보고 싶은게 생겨서 다시 시작하게되었습니다. 예전의 초보로 돌아가서 새로운 마음으로 하나하나 진행해보도록 하겠습니다. 현재 메인 컴퓨터는 맥북을 사용하고 있어서 Mac OS 기준으로 블로깅 하도록 하겠습니다.

 

그 당시에는 이클립스로 개발하였는데, 이제는 Android Studio로 통합되었네요.  먼저 안드로이드 스튜디오(Android Studio) 설치법에 대해서 알아보도록 하겠습니다.

 

1. Android Studio 다운로드 진행을 위해 아래 사이트에 접속합니다.

https://developer.android.com/studio

 

2. DOWNLOAD 버튼을 누르면 아래와 같은 페이지가 발생하고, 약관에 동의 후 다운로드를 시작합니다.

 

 

3. 다운로드된 파일(android-studio-ide-192.6392135-mac.dmg)을 실행하면 아래 화면이 발생합니다.

Android Studio 아이콘을 Application 폴더위에 드래그 해보겠습니다.

 

 

4. 설치가 완료되면, Launchpad에 Android Studio 가 설치된 것을 확인할 수 있습니다. Android Studio 를 실행해보겠습니다.

 

"열기" 버튼을 눌러보겠습니다.

이전에 설치했던적이 있다면 이전의 설정 파일들을 import 할 수 있는 팝업이고, 이전의 설정파일이 없다면 "Do not import settings" 상태로 "OK"를 누르겠습니다.

 

Google이 Android Studio를 개선하기 위해 당신의 Android Studio 사용 방식을 수집하겠다는 내용으로, 동의하시면 "Send usage statistics to Google" 버튼을 누르고, 동의하지 않으시면 "Don't send" 버튼을 누르겠습니다. 프로그램 개선에 도움이 도움이 되는 것이니 저는 "Send usage statistics to Google" 버튼을 누르겠습니다.

 

5. 초기설정을 진행할 수 있는 Setup Wizard 가 발생하였습니다. "Next" 버튼을 눌러서 진행해보겠습니다.

 

"Standard" 기본으로 두고 "Next" 버튼을 누르겠습니다. 

 

UI 테마 선택화면입니다. 저는 눈에 피로를 덜어주는 다크 모드를 선택해주도록 하겠습니다. "Next"

 

"Finish" 버튼을 눌러 Setup Wizard를 마무리 해주도록 하겠습니다. 

 

설치 도중에 아래와 같이 HAXM 설치를 위한 암호 확인을 요청하기도 합니다. Intel의 HAXM 이란 Hardware Accelerated Execution Manager로써 애뮬레이터를 빠르게 실행하기 위한 기능이라고 합니다. 암호 입력 후 "확인" 버튼을 누릅니다.

 

 

아래 화면이 떴다면, Android Studio 사용을 위한 모든 작업을 마친 것입니다. 프로젝트 생성은 다음 편에 업로드 하도록 하겠습니다. 

감사합니다.

 

+ Recent posts