이번에는 Activity 를 새로 만들고, 만든 Activity 를 시작하는 방법에 대해 알아본다.

Android 는 Activity 를 시작시킨 때 Intent 를 기반으로 하여 시작시킨다. 이 Intent 에 메인 뷰의 EditText 로 입력받은 String 을 추가하여 새로 만든 Activity 를 시작할 때 넘겨주고, Activity 는 TextView 를 포함하는 Layout (ViewGroup)을 통해 전달받은 메시지를 표시해주는 방식이다.

▌버튼 눌렸을 때 호출 될 메소드 정의하기

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage"/>


▌새로운 Activity 실행위한 Intent 생성하기

public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class)// Intent 를 신규 생성, DisplayMessageActivity 를 실행하기 위한 Intent 를 생성함
    EditText editText = (EditText) findViewById(R.id.edit_message)// 현재 Activity 의 OnCreate 에서 처리된 Bundle 의 XML 내에 있는 id 값에 해당하는 View 를 가져옴
    String message = editText.getText().toString()// EditText 의 값 가져옴
    intent.putExtra(EXTRA_MESSAGEmessage)// EXTRA_MESSAGE 를 Key 로 하고 내용을 message 로 하는 데이터를 Intent 에 추가 함. Key-Value Pair 의 extra 를 Intent 에 추가함
    startActivity(intent);
}

public final static String EXTRA_MESSAGE "com.goodjoon.helloandroid.MESSAGE";


▌Activity 추가를 위한 과정

  1. Activity XML 생성
  2. strings.xml 에 Activity Title 추가
  3. Content XML 생성
  4. Android Manifest 에 Activity 등록
  5. Activity 클래스 작성

▌신규 Activity 추가 - Studio 의 New Activity 기능 사용하여 추가하기


원하는 Package 에서 우측클릭>New>Activity>Blank Activity 를 눌러서 Activity 를 추가한다.


Activity 이름을 주고, 중간의 Hierarchical Parent 에서 "..." 을 눌러 메인 Activity 인 HelloActivity 를 선택한다.


Hierarchical Parent

Activity 를 추가할 때 Hierarchical Parent 를 주면, 기본적인 Navigation 동작이 추가된다. up Navigation 버튼이 Navigation Bar 에 추가되고, Back 버튼을 눌렀을 때 Parent Activity 가 호출되는 등의 Action 이 실행된다.

<androidManifest.xml> 내용 중
<activity
    android:name=".DisplayMessageActivity"
    android:label="@string/title_activity_display_message"
    android:parentActivityName=".HelloActivity"
    android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.goodjoon.helloandroid.HelloActivity" />
</activity>

위에서 android:parentActivityName=".HelloActivity" 가 추가된 것을 볼 수 있다.
나중에 수동으로 Activity 를 추가하면 저렇게 parentActivity 를 주면 된다.

위 과정으로 추가하면

  1. Activity XML 생성
  2. Content XML 생성
  3. AndroidManifest.xml 에 Activity 등록
  4. string.xml 에 Activity Title 등록
  5. Activity 클래스 추가

와 같은 과정이 자동으로 실행된다

  1. Activity XML 생성


  1. Content XML 생성

Content XML 이 생성되면 아래와 같이 RelativeLayout 요소의 마지막에 android:id="@+id/content" 를 하여 id 를 하나 부여해주어 Code 에서 findViewById() 로 쉽게 Layout 을 갖고오게 하자.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    ...
    android:id="@+id/content">


  1. Activity 클래스에서 메시지 받아 출력해주기

TextView 뷰를 하나 추가하고, Intent 의 Message 를 TextView 에 출력하도록 할 것이다.
Layout XML 에 추가하는 방법 말고, Activity 클래스에서 코드로 추가하는 방법으로 해본다.

일단, 자기 Activity 를 실행시킨 Intent 내에 Extra 데이터(메시지)를 가져오고,
TextView 뷰를 생성한 다음, 이 뷰를 Layout 을 가져와 그 Layout 에 추가하는 작업을 한다.

코드는 아래와 같다. 자동 생성된 Activity 클래스의 onCreate 의 하단에 해당 내용을 추가하면 된다.
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_display_message);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view"Replace with your own action"Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    // Activity 는 자신을 시작시킨 Intent 를 가져올 수 있음
    // Intent 에서 메시지를 가져오도록 함
    Intent intent = this.getIntent();
    String message = intent.getStringExtra(HelloActivity.EXTRA_MESSAGE);

    // TextView Object 를 만든다
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // 만들어진 TextView 를 RelativeLayout 에 붙인다
    RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
    layout.addView(textView);

}


▌실행 결과

 


실행 결과는 위와 같다. 텍스트를 입력하고 "보내기" 버튼을 누르면 Intent 를 생성하여 ExtraData 로 Message 를 추가하고, DisplayMessageActivity 를 생성한 Intent 로 시작시킨다.(실행 보다는 '시작' 이 적합한 단어라고 생각한다)










반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
 Auto Completion, Code Assist, Code Suggestion, Parameter Info 등등의 이름으로 불리우는 자동 완성 기능. Visual Studio 와 Visual AssistX 플러그인은 아마 현존 최고의 Assist 기능이 아닐까 생각된다. 

 XCode 의 자동완성 기능도 매우 훌륭한 편이며, Eclipse 또한 많이 괜챦아졌다. IntelliJ 를 기반으로하는 Android Studio 의 자동완성 기능이 어느정도일지 궁굼했는데, 잠깐 사용해본 결과 Eclipse 보다는 낫다는 생각이다. ^^

□ TIP - Auto Completion 관련한 단축키들

Auto Completion / Suggestion / Assist 기능들은 IDE 를 쓰는 큰 이유중의 하나이다. Android Studio 는 IntelliJ 기반의 IDE 이며, 아래와 같은 기능들을 제공한다.

- ALT+Enter (Show Intention Action)
Import 되지 않은 클래스를 Import 하려면 이 키를 사용한다. 매우 자주 사용하는 키 이다. 클래스 import 이외에도, 현재 상황에서 무언가 의도한 액션을 수행하고자 하면 가능한 액션들이 보여진다.
단순히 import 를 편하게 하려면 Settings... 메뉴에서, Editor>General 의 Auto Import 기능에서 on the fly 기능들을 켜놓으면 즉시 Import 되도록 할 수 있다.


- Ctrl+Q (Quick Documentation)
현재 Caret 이 위치한 Class 나 method 의 Document 를 보여준다.


- Ctrl+P (Parameter Info)
현재 Method 의 파라미터 정보를 보여준다. Overload 된 Method 의 Parameter Info 까지 모두 한눈에 볼 수 있어서 편리하고 자주쓰는 기능이다.


- Ctrl+Space (Basic Completion)
Basic Auto Completion 기능으로, 입력중인 내용의 자동완성 목록을 보여준다. 가장 많이 쓴다.
그런데 불행하게도 한글 키보드를 쓰는 나같은 경우는 Ctrl+Space 가 "한자" 기능에 키보드 맵핑이 되어있어 이 Basic Completion 기능이 동작하지 않는다. 그래서 나같은 경우는 Ctrl+, 로 변경해서 사용중이다.


- Shift+Ctrl+Space
SmartType Auto Completion 기능으로, Basic Auto Completion 대비 현재 Context 에 더욱 맞는 Type Completion List 를 보여준다는데, 아직까지는 잘 사용하지 않고있다. 향후에 많이 써보면서 더 알아보도록 하겠다.




□ 주의 - 자동으로 import 가 갱신되지 않을 때, 즉시 자동으로 Import 되도록 하는 방법

Eclipse 플러그인으로 동작하던 때에는 사용하는 클래스에 따라 자동으로 import 문도 optimize 해주고 했었는데, 이상하게 Android Studio 는 Optimize Import (Ctrl+Alt+O) 를 눌러도 자동으로 Import 를 시켜주지 않는다.
이럴때에는 Settings... 메뉴에서, 아래 두개 옵션을 체크해주면 일단 해결된다.


이상 단축키와 관련 메뉴에 대해서 살펴보았다. 필요한 때에 적절하게 단축키를 눌러서 생산성 있는 개발이 되도록 하자~


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
이번에는 이전에 생성한 프로젝트 내부의 구조에 대해 살펴보도록 한다.

Project 를 만들고 나면, 좌측의 Project View 를 통해서 res/layout 디렉토리에 생긴 메인 Activity (New Project 에서 생성한)를 열어본다.

위와 같은 구조의 프로젝트 내 파일들이 보이게 된다.


Activity Layout

Activity 의 Layout 을 정의하는 XML 이며, Design 과 Text (코드)를 볼 수 있는 Tab 이 모두 존재한다.


이 Activity Layout XML 에는 앱 상단의 앱바와 Floating Action Button 같은 (향후에 더욱 자세히 보도록 하고) 컴포넌트의 속성이 XML 의 Element 와 Attribute 로 설정되어있다

위 처럼 기본적인 Blank Activity 를 생성하면 Action Bar, Content, Floating Action Button 이 생성된다.

Activity 의 전체적인 Layout 은 activity XML 에 정의가 되고, TextView 로 구성된 Content 영역은 content XML 에 정의되어있다. 

Activity XML 의 중간 쯤에 보면

<include layout="@layout/content_hello" />

이 들어가 있고, 이렇게 content_hello 라는 Layout 요소를 추가적으로 포함(include) 하도록 되어있다. 그리고, content_hello.xml 파일을 보면

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>

위 처럼 TextView Element 로 추가적인 Layout 이 구성됨을 볼 수 있다. 텍스트 내용으로 "Hello World!" 라는 텍스트도 보인다.


Main Activity.java

app\src\main\java\com\goodjoon\helloandroid\HelloActivity.java 파일을 열어본다. 
현재 Main Activity 는 HelloActivity 로 등록되어 있으며. Activity XML 리소스 파일이 이 java 파일에 연결되어 있음을 확인할 수 있다.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_hello); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

앱을 실행시키면 이 Activity 클래스가 실행되고 Main Activity XML 리소스가 로드되어 Hello World! 가 출력되는 메인 Activity 가 나옴을 확인할 수 있다.


앱 Manifest

app\src\main\AndroidManifest.xml 파일은 앱의 기초적인 특성과 각 컴포넌트를 정의하는 파일이다. 컴포넌트를 추가하면 이 파일이 지속적으로 변경되게 된다.


Gradle 빌드파일

app\build.gradle 파일은 Project View 에서는 "Gradle Scripts" 라는 별개의 그룹으로 표시되는데, 실제 위치는 app\ 디렉토리 밑에 존재한다.

Android Studio 는 앱을 컴파일 하고 빌드하는데에 Gradle 을 사용한다. 

프로젝트의 각 모듈 별로 build.gradle 파일이 존재하며 프로젝트 전체에 또 하나의 build.gradle 파일도 존재한다. 보통 각 모듈 내의 build.gradle 파일이 주요 관심 대상이 된다. 지금 모듈은 app 모듈이다.


위의 build.gradle 은 프로젝트 전체에 대한 build.gradle 스크립트 (프로젝트디렉토리\build.gradle)이고, app 모듈에 대해 build.gradle 파일(프로젝트디렉토리\app\build.gradle)이 추가적으로 존재한다.

Module build.gradle 파일 안에 보면 defaultConfig 을 포함한 몇가지 설정이 있다


apply plugin'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.goodjoon.helloandroid"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir'libs'include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}

  • compileSdkVersion 
    앱을 Compile 하기 위해 사용하는 Platform SDK 의 버전을 명시한다. 기본적으로 설치되어있는 SDK 버전 중 가장 최신의 SDK 를 사용하도록 설정되어있다. 위 설정에서는 API Level 23 (=SDK Version 23 = Android 6.0 = 마쉬멜로우) SDK 를 사용하도록 되어있으므로, 만약 SDK 가 설치되어있지 않다면, SDK Manager로 SDK 를 설치해야 한다.
    SDK 버전이 높다고 해서 구버전 앱을 빌드할 수 없는게 아니며(하위호환성 유지) 오히려 낮은 버전의 SDK 로 빌드하게 되면 더 높은 버전의 Platform 에서는 새로운 기능을 사용할 수 없거나 더 좋은 UX 를 사용할 수 없게된다.
  • applicationId
    New Project Window 에서 지정했던 Package 이름으로, App 의 유일한 식별자이다.
  • minSdkVersion
    현재 앱이 지원하는 가장 낮은 SDK 버전을 지정
  • targetSdkVersion
    현재 앱이 지원하는 가장 높은 SDK 버전. 자신이 테스트해본 가장 높은 버전을 명시하면 된다


기타 리소스

  • drawable-<density>/ 리소스 디렉토리 <ldpi(0.75), mdpi(1.0), hdpi(1.5), xhdpi(2.0)>
    이 디렉토리에는 밀도 독립 픽셀(DIP: Density Independent Pixel)별 drawable 이미지나 아이콘 같은 "그려지는" 리소스가 위치한다. DIP 에 대해서는 나중에 더 설명하도록 하자. 일단, Android 는 다양한 해상도를 갖는 기기가 많으므로, pixel (px) 단위가 아닌 dp 나 sp 단위로 크기를 지정해야 한다.
    참조는 @drawable/image.png 와 같이 사용한다.

  • layout/
    activity XML 과 같이 앱의 UI 를 정의하는 파일들이 위치한다. 

  • menu/
    앱의 메뉴 아이템을 정의하는 파일들이 위치

  • mipmap/
    Launcher 아이콘(앱아이콘)으로, drawable/ 폴더 대신 이 폴더를 사용한다. ic_launcher.png 아이콘 이미지들이 해상도별로 들어있다.

  • values/
    String 이나 Color 정의와 같은 리소스 컬렉션을 포함하는 XML 파일들이 위치하는 디렉토리 이다.




반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,


 4년 간 Hybrid Mobile App 개발도구를 포함한 MEAP 솔루션 개발을 리딩해왔지만 모바일쪽 개발은 주로 iOS 만을 해왔다. 안드로이도 개발은 직접 하지 않았는데, 올해 사적인 프로젝트를 하나 진행하기 위해 안드로이드쪽 앱을 직접 개발하지 않으면 안되는 상황이다.

 작년 초반 까지만 해도 Eclipse에 Android Development Tools 플러그인을 설치하고, XCode 의 Command Line Build 를 함께 쓰도록 하여 Hybrid App 개발툴킷을 만들었지만 작년 중반 이후에 Google에서 Android Studio 만을 사용하도록 강력히 밀고있는 상황이라 난 Android Studio 를 사용하기로 결정했다.

 일단, Android Studio 를 다운로드 받는다


■ 신규 프로젝트 생성

Android Studio를 설치 후 실행하면, 아래 처럼 New Project Window 가 실행된다

처음 프로젝트를 시작하므로, "Start a new Android Studio Project" 를 선택


New Project 화면에서의 요소별 설명은 다음과 같다

  • Application Name - 사용자에게 보여질 앱 이름이다
  • Company Domain - 실제 Domain 일 필요는 없고, App 을 구별하기 위한 Package ID 의 base 값 정도로 생각하면 된다. goodjoon.com 을 넣으면 자동으로 Package Name 이 com.goojoon.<소문자 기반으로한 앱 이름>
  • Package Name - Application Name 과 Company Domain 을 조합하여 만든 Package 이름이다. 이게 Android App 을 식별하는 유일한 이름이 된다

※ 한글 앱 이름

앱 이름이 한글이면, Package Name 이 자동생성 되지 않는다 이때는 Package Name 우측에 보이는 "edit" 를 클릭하여 수동으로 패키지 이름을 변경해주면 된다.

또한 가급적이면 Project location 에 한글명이 들어가는 경로는 피하도록 하자.


이제 Target Android Device 를 선택한다. Minimum SDK 목록을 보면 이제 친절하게도 API Level 과 함께 OS 이름도 나온다. 이 SDK 를 잘 설정해주어야 나중에 어떤 버전 기기에서는 보이네 안보이네 하는 문제에서 자유로울 수 있다.


더 놀라운것은, SDK 를 선택하면, 세계적으로 해당 SDK 버전 이상의 OS 사용자 비율을 보여준다는 것이다. 위 화면에서는 4.2 젤리빈으로 개발하면 전세계 약 81.4% 의 Android 기기에 설치될 수 있는 앱을 개발할 수 있음을 보여준다


이제 이렇게 SDK 까지 선택한 후, 처음 실행 될 Activity 를 선택하는 화면이 나온다. 다음 편에서는 Android 의 Activity 가 무엇인가 부터 찬찬히 살펴보도록 하겠다





반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,