[1] 첫 앱 만들기 [4] 다른 액티비티 시작하기

다른 액티비티 시작하기

이번 시간에 배울 것  –  THIS LESSON TEACHES YOU TO

  1. Send 버튼에 반응하게 만들기
  2. 인텐트 생성하기
  3. 두 번째 액티비티 만들기
  4. 인텐트 받기
  5. 메시지 출력하기

함께 봐야 할 것 – YOU SHOULD ALSO READ

Installing the SDK

why 다른 액티비티 시작하기?

앱을 만들 때 한 화면만 구성한다면 다른 액티비티를 만들고 시작할 이유가 없습니다. 하지만 두 개 이상의 화면을 보여주려면 화면 간 이동을 해야겠지요. 그 이동을 하기 위해서 다른 액티비티 시작하기 수업을 배웁니다.

 

1. Send 버튼에 반응하게 만들기


 

  1. 안드로이드 스튜디오 – res/layout 폴더 – activity_my.xml 파일을 편집하겠습니다.
  2. <Button> 요소에서  android:onClick 속성 추가합니다.

    res/layout/activity_my.xml

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

    android:onClick 속성의 값은 “sendMessage” 입니다.
    이 이름은 사용자가 이 버튼을 눌렀을 때, 시스템이 호출할 액티비티에 있는 메서드의 이름입니다.
    사용자가 이 버튼을 누르면 시스템이 액티비티를 호출하게 할 것입니다.
    그리고 그 액티비티에 있는 특정 메서드를 실행하게 할 것입니다.
    바로 저 값으로 지정한 그 메서드를 실행하게 할 것입니다.

  3. java/com.mycompany.myfirstapp 폴더에서 MyActivity.java 파일을 오픈합니다.
  4. MyActivity 클래스 내에서, sendMessage() 메서드스텁을 아래와 같이 추가합니다.
    java/com.mycompany.myfirstapp/MyActivity.java

    /** Called when the user clicks the Send button */
    public void sendMessage(View view) {
        // Do something in response to button
    }

    시스템이 위의 (자바파일에 있는)  sendMessage 메서드를 (XML 파일에 있는) android:onClick 에서 명시한 메서드 네임과  맞춰주기 위해서, 메서드는 반드시  정확하게 시그너처(형식)를 맞춰줘야 합니다.

    • public 일 것
    • 리턴 값이 void 일 것
    • 단 하나의 View 를 파라메터로 가지고 있을 것 (이 것은 클릭 되어진 View 입니다)

다음으로, 텍스트 필드 안의 내용을 읽고, 그 텍스트를 다른 액티비티에게 전해주기 위해서 메서드를 채워야 합니다.

2. 인텐트 만들기


  1. MyActivity.java 파일 내 sendMessage() 메서드 내에서, DisplayMessageActivity 라고 명명한 액티비티(새로 만들 액티비티 이름을 DisplayMessageActivity 라고 지을 거에요)를 시작하기 위해서 Intent 를 다음 코드로 생성합니다.

    java/com.mycompany.myfirstapp/MyActivity.java

    public void sendMessage(View view) {
      Intent intent = new Intent(this, DisplayMessageActivity.class);
    }

    주의 : 만약 우리가 안드로이드 스튜디오 같은 IDE를 사용한다면 DisplayMessageActivity에 대한 참조는 오류를 발생시킵니다. 왜냐하면 클래스가 아직은 존재하지 않기 때문입니다. 이 에러를 지금은 무시하겠습니다. 여러분은 위에 해당하는 클래스를 아래에서 곧 만들겁니다.

    여기서 사용된 생성자는 2 개의 파라메터를 가지고 있습니다.

    • 첫 파라메터 : Context (this 가 사용됩니다. 왜냐하면 Activity클래스는 Context 의 자식클래스기 때문입니다.)
      A Context as its first parameter (this is used because the Activity class is a subclass of Context)
    • 두 번째 파라메터 : 시스템이 그 인텐트를 전달해 줄 대상이 될 앱의 클래스(이 경우, 새롭게 될 시작될 액티비티 )
      The Class of the app component to which the system should deliver the Intent (in this case, the activity that should be started)

    이 때, 안드로이드 스튜디오는 우리가 반드시 Intent 클래스를 import 해야한다고 지시합니다(아래 팁을 보면 됩니다).

  2. 액티비티 파일의 (우리가 처음에 생성했던 파일이지요?) 맨 위에서, 다음과 같은 코드를 추가합니다.
    import , 즉, 안에 수입을 한다는 것이지요.
    일반적으로 import 와 export 라는 개념을 많이 씁니다.
    다른 나라의 물건을 들여 올 때 import, 수출할 때 export 한다고 하지요.
    코드의 경우도, 다른 코드 등을 가지고 올 수 있는데요, java에서는 import 라는 것으로 들여옵니다.
    Intent class 를 import 하겠습니다:

    java/com.mycompany.myfirstapp/MyActivity.java

    import android.content.Intent;

    Tip: 안드로이드 스튜디오에서, Alt + Enter 키를 누르면 (맥 PC에서는 option + return ) 필요한 클래스들이 자동으로 import 됩니다.

  3. sendMessage() 메서드 내에서 , EditText element 를 얻기 위해서 findViewById() 를 사용합니다.

    java/com.mycompany.myfirstapp/MyActivity.java

    public void sendMessage(View view) {
      Intent intent = new Intent(this, DisplayMessageActivity.class);
      EditText editText = (EditText) findViewById(R.id.edit_message);
    }
  4. 이 파일의 맨 위에서, EditText class 를 import합니다.
    안드로이드 스튜디오에서 Alt + Enter 키를 눌러 누락된 클래스가 생성되도록 합니다.
  5. 로컬 변수  message 에 문자를 할당해줍니다.
    텍스트 값을 인텐트에 더하기 위해서  putExtra() 메서드를 사용합니다.

    java/com.mycompany.myfirstapp/MyActivity.java

    public void sendMessage(View view) {
      Intent intent = new Intent(this, DisplayMessageActivity.class);
      EditText editText = (EditText) findViewById(R.id.edit_message);
      String message = editText.getText().toString();
      intent.putExtra(EXTRA_MESSAGE, message);
    }

    인텐트는 데이터 타입을 key-value 쌍으로 전달할 수 있습니다.
    key-value 쌍을 이른 바  extras 라고 부르지요.
    putExtra() 메서드는 첫 인자로 가, 두 번째 인자로 실제 값이 필요합니다.

  6. MyActivity 클래스의 맨 위에서 EXTRA_MESSAGE 의 정의를 다음과같이 추가해줍니다.

    java/com.mycompany.myfirstapp/MyActivity.java

    public class MyActivity extends ActionBarActivity {
        public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE";
        ...
    }

    다음 액티비티에 extra 데이터를 쿼리하기 위해서, 키를 정의해야만 합니다.
    For the next activity to query the extra data, you should define the key for your intent’s extra using a public constant.
    intent extras 를 위해 key 를 정의하는데에 있어 앱의 패키지네임을 접미어로써 사용하는 것은 일반적인 일입니다. 패키지 네임을 접미어로 사용하면 키가 고유한 값을 가질 수 있게 보증해 줍니다
    It’s generally a good practice to define keys for intent extras using your app’s package name as a prefix. This ensures the keys are unique, in case your app interacts with other apps.

  7. sendMessage() 메서드에서, 인텐트를 마무리 하기 위해,  startActivity() method를 호출합니다. 1번 단계세서 생성했던  Intent object를 패스해주면서 말이지요. to finish the intent, call the startActivity() method, passing it the Intent object created in step 1.

이 새 코드로, 우리는  sendMessage() 메서드를 완성합니다. Send 버튼을 통해 실행됩니다. 완성된 코드는 다음과 같습니다.

java/com.mycompany.myfirstapp/MyActivity.java

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

시스템이 호출을 받고, Intent에 명시된  Activity 를 시작합니다.
이제, 정말로 버튼을 작동시키기 위해서 DisplayMessageActivity class를 생성해야합니다.

3. 두 번째 액티비티 생성하기 : Create the Second Activity


Activity의 모든 서브클래스(자식클래스)들은 반드시 onCreate() 메서드를 구현해야 합니다. 즉, 액티비는 반드시 클래스에서 onCreate() 메서드를 구현 해야한다는거죠. (추상클래스인가 인터페이스인가요?)
액티비티는 메시지와 함께 인텐트를 받고 메시지를 그립니다.
또한 onCreate() 메서드는, 액티비티 레이아웃을 setContentView() 메서드를 통해서 반드시 정의해야 합니다.
이 것이 액티비티가 액티비티 컴포넌트들을 초기화하는 방법입니다.
(내용물을 모르니까 일단 보이는 대로 번역하겠습니다.)

새로운 액티비티를 안드로이드 스튜디오로 만들들기

그림 1. 안드로이드의 new activity wizard

안드로이드 스튜디오는 여러분이 새로운 액티비티를 생성할 때 onCreate() 메서드를 포함합니다.

  1. 안드로이드 스튜디오 – java 폴더 내에 com.mycompany.myfirstapp 패키지에서 우클릭 후 New > Activity > Blank Activity 선택
  2. 다음과 같이 내용을 채웁니다
    • Activity Name: DisplayMessageActivity
    • Layout Name: activity_display_message
    • Title: My Message
    • Hierarchical Parent: com.mycompany.myfirstapp.MyActivity
    • Package name: com.mycompany.myfirstapp

    Finish 클릭합니다.

  3. DisplayMessageActivity.java 파일을 오픈합니다.
    클래스는 onCreate() 메서드가 필요한 구현을 이미 포함하고 있습니다.
    The class already includes an implementation of the required onCreate() method.
    우리는 이 메서드의 구현을 다음에 업데이트 할 것입니다.
    또한 이 클래스는  onOptionsItemSelected() 의 구현도 포함되어 있는데요,
    이 메서드는 액션바의  Up behavior를 다룹니다.(오…처음 나온 개념이네요. 무슨 말인지는 모르겠지만 그냥 여기서는 “모르는 것을 견딜 줄 아는 인내” 를 발휘하겠습니다. 분명 뒤에 나올거에요).
    위 두 메서드는 계속 유지시키세요.
  4.  onCreateOptionsMenu() 는 지워줍니다. 우리는 이 기능을 이 앱에서는 사용하지 않을 아요.

안드로이드 스튜디오를 사용하고 있다면, 우리는 이제 이 앱을 동작시킬 수 있습니다.
하지만 그렇게 많은 일이 나타나진 않습니다. Send 버튼을 누르면 두 번째 액티비티가 시작되긴 합니다.
하지만 새로 열린 액티비티는 기본 “Hello world” 레이아웃을 사용하기 때문에 심플하지요.
이제 우리는 곧 이 액티비티를 업데이트 해 보겠습니다.

4. 인텐트 받기 : Receive the Intent


다른 곳에서 버튼을 눌렀습니다. 그 버튼을 눌렀을 때 옆의 에디트박스에 있는 내용을 긁어서 인텐트로 넘겨주었지요
이제 그 인텐트를 해석해봅시다.

모든 Activity는 Intent에 의해서 실행됩니다, regardless of how the user navigated there.
우리는 앱이 시작될 때  getIntent() 을 호출해서  Intent를 얻을 수 있고, 그 안에 들어있는 데이터를 검색할 수 있습니다.

  1. java/com.mycompany.myfirstapp 폴더에서 DisplayMessageActivity.java 파일을 수정합니다.
  2. onCreate() 메서드에서 다음 라인을 제거합니다.
      setContentView(R.layout.activity_display_message);
  3. intent 를 획득하고 지역변수에 이를 할당합니다.
    Intent intent = getIntent();
  4. 파일의 가장 윗부분에,  Intent 클래스를 import 합니다. Intent가 빨간 및줄이 그어져 있을 것입니다. 그 위에 커서를 두고 Alt + Enter,  맥이라면 option + return 키를 눌러서 클래스를 import합니다.
  5.  MyActivity 를 통해 전달된 메시지를 / getStringExtra() 메서드를 통해서 /추출해 냅니다.
    String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);

5. 메시지 출력하기 – Display the Message


  1.  onCreate() 메서드에서  TextView 오브젝트를 생성합니다.
    TextView textView = new TextView(this);
  2. 텍스트 사이즈를 정합니다. 텍스트에 메시지를  setText() 를 이용하여 셋팅합니다.
    textView.setTextSize(40);
    textView.setText(message);
  3. 그리고  TextView 를  setContentView()로 넘겨줌으로써 액티비티 레이아웃의 루트 뷰로써 추가합니다.
    setContentView(textView);
  4. 파일의 가장 윗부분에,  TextView 클래스를 import 합니다. TextView에  빨간 및줄이 그어져 있을 것입니다. 그 위에 커서를 두고 Alt + Enter,  맥이라면 option + return 키를 눌러서 클래스를 import합니다.

 DisplayMessageActivity 의 완성된 onCreate() 메서드는 다음과 같습니다.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Set the text view as the activity layout
    setContentView(textView);
}

이제 우리는 앱을 실행시킬 수 있습니다. 앱이 열리면, 텍스트 필드에 메시지를 입력해보세요. 그리고 Send 버튼을 눌러보세요, 그러면 메시지가 두 번째 액티비티에서 나타날 것입니다.

그림 2. 앱의 두 액티비티가 안드로이드 4.4 에서 구동되는 모습

완성입니다. 우리는 우리의 첫 안드로이드 앱을 성공적으로 만들었습니다!

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중