dngchn's [Android]2014. 11. 3. 13:54

안드로이드 앱 상에서 빈번히 발생하는 뷰의 전환 방법에 대해 이야기 해보자.

하나의 뷰는 Activity에 의해 관리된다. 뷰, 즉 사용자가 보는 화면이 전환된다는 의미는 Activity가 전환된다는 의미이다.

현재 보여지고 있는 뷰에서 다른 뷰로의 전환은, 전환하고자 하는 다른 뷰를 말 그대로 아래와 같이 시작시키면 된다.


StartActivity(anotherIntent);


위에서 인자인 anotherIntent는 Intent 타입 객체이다.

새롭게 화면상에 보이고자 하는 intent를 만들어 인자로 넘기는 구조이다.

이는 보통 아래와 같이 작성하여 준비한다.


Intent anotherIntent = new Intent(getApplicationContext(), AnotherActivity.class);


우선, 위와 같이 기본적인 개념만 잡고 직접 실습을 통해 시작해보자.

우선 재빨리 New->Android Application Project메뉴를 통해 ChangeViewTest 이름의 프로젝트를 생성하자.

기본 Hello world 프로젝트에 Activity(View)를 하나 추가하여 전환시켜보자.

일단 기본 뷰에 버튼을 하나 두고, 누르면 다른 뷰로 전환, 다른 뷰에서 버튼을 눌러 닫으면, 원래 뷰로 돌아오는 시나리오로 만들어 보자.

또 다른 뷰를 위해 레이아웃(activity_another.xml)과 액티비티(AnotherActivity.java) 추가한다.



우선, 기존 레이아웃과 액티비티 먼저 준비하자.

기존 레이아웃(activity_main.xml)에는 버튼 하나 추가 한다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    <Button
        android:id="@+id/nextButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Next"
        /> 

</LinearLayout>


기존 액티비티(MainActivity.java)에는 버튼에 대한 핸들러를 아래와 같이 추가한다.

기본 개념대로 Next 버튼을 클릭했을 때, 새롭게 띄워질 뷰에 대한 Intent를 준비하여 'startActivity'를 통해 새로운 액티비티를 시작해준다. 간단하다.

public class MainActivity extends ActionBarActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Button btnNext = (Button) findViewById(R.id.nextButton);
		btnNext.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent anotherIntent = new Intent(getApplicationContext(), AnotherActivity.class);
				startActivity(anotherIntent);				
			}
		});
	}


이제 새로이 추가한 레이아웃과 액티비티를 다음과 같이 작성한다.

우선 레이아웃,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <Button
        android:id="@+id/closeButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Close"
        />   

</LinearLayout>


그리고 액티비티,

public class AnotherActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_another);
		
		Button btnClose = (Button) findViewById(R.id.closeButton);
		btnClose.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				finish();				
			}
		});
	}
}

위에서도 어려울 것 없다. 새롭게 보여지는 뷰는 달랑 버튼 하나를 갖고 있으며,

버튼이 클릭되면 자신을 죽인다(finish).


자, 위 기본 개념대로 새롭게 뷰를 전환할 준비가 다 되었다. 컴파일 하고 결과를 확인 해보자.

...

...

잘 되는지?

아마도 에러가 날 것이다. 이렇게 까지 먼저 해보도록 하는 이유는, 다음에서 필요한 과정을 깜빡 잊기 쉬워,

다시 한번 이렇게 강조 하고자 함이다.

우리는 앱에 새롭게 액티비티를 추가하였다. 이에 대한 사실을 명확히 알려야 한다. 다시 말해 우리의 앱을 실행 시킬 그 무언가의 주체에게 우리 앱은 이러저러한 액티비티가 있다고 알릴 필요가 있다. 어디에?

바로 AndroidManifest.xml에!


매니페스트 파일(AndroidManifest.xml)에 다음과 같이 액티비티를 추가하자.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.changeviewtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <!--새롭게 추가한 액티비티 정의 -->
        <activity android:name=".AnotherActivity"></activity>
    </application>

</manifest>


자, 이제 다시 실행해보자. 아래와 같이 화면이 뜨고, Next를 누르고, Close를 눌러보자.

성공이다! 우리가 새롭게 끼워 넣은 뷰가 보이고 닫히고, 단순하기 그지 없지만, 우리가 의도한 시나리오 대로 잘 동작 한다.





이것으로 아직 끝나지 않았다. 뭐 대충 화면 전환은 되지만, 실제 앱이 동작하는 시나리오를 생각 하자면,

원래 뷰와 새롭게 뜨고 죽는 뷰 사이에 무언가 데이터를 주고 받을 필요가 있을 것이다.

예를 들자면, 새롭게 뜨는 뷰를 통해 무언가 사용자에게 정보 입력을 받기위해서는 새로 뜬 뷰가 죽고 나서

사용자가 입력한 정보를 원래 뷰로 돌려줘야할 필요도 있을 것이고,

반대로 새로운 뷰가 뜰때 원래 뷰가 갖는 데이터를 보여줘야 할 필요도 있을 것이다.

이와 같은 시나리오에 대해서는 다음 글에서 한번 이번 예제를 확장시켜 알아보자.


Posted by dngchn