[ Layout에서 별도 Layout 띄우기 ]
1. 소스 흐름 순서
- MainActivity.java 에서
activity_main.xml Layout 에서 another1.xml layout을 띄우거나, another2.xml layout을 띄울 수 있다.
activity_main.xml <-> another1.xml
<-> another2.xml
- MainActivity.java에서 띄워야 할 화면들이 여러 개가 되면서 띄웠던 화면을 닫고 원래 Main화면으로 돌아 올 때
어느 띠웠던 화면에서 돌아 왔는지 알아야 될때가 있다
또한 띠웠던 액티비티로부터 응답(param)값 받아 처리해야 되는 경우도 있다.
startActivityForResult()를 이용해서 이 문제를 해결 할 수 있다.
2. startActivityForResult(Intent intent, int requestCode)
- intent : 띄울 Activity
- requestCode : 띄워야할 화면이 여러개 일 때 구분하기 위한 정수값
띄운 화면에서 사용할게 아니고, 띄웠던 화면이 닫히고 다시 Main화면으로 왔을때
어떤 화면에 돌아 왔는지 알기 위한 값이다.
3. onActivityResult(int requestCode, int resultcode, Intent intent)
- 정의 : 띄었던 화면이 닫히면 자동으로 호출 되는 메소드
- requestCode : 어떤 화면에서 돌아 왔는지 구분값
- resultcode : 응답을 보내 온 액티비티로부터 전달된 값으로 보통 성공(200), 실패(400) 결과 값이 전달됨
(그런데, 왜 난 -1 값이 찍힐까????)
- intent : 띄웠던 화면의 intent. argument값을 들이 넘겨저 온다.
응답을 보내 온 액티비티로부터 전달한 인텐트로 필요한 데이터가 있을 때 인텐트에 데이터를 넣어 전달.
[ AndroidManifest.xml ] - 아래 2개의 activity tag가 존재 해야 inflate를 할 수 있다.
<activity android:name=".AnotherActivity1"/> <activity android:name=".AnotherActivity2"/> |
[ MainActivity.java ]
/** * 인텐트를 이용해 새로운 액티비티를 띄우고 다시 돌아오는 방법에 대해 알 수 있습니다. * * @author Mike */ public class MainActivity extends AppCompatActivity {
/** * 요청 코드 정의 */ public static final int REQUEST_CODE_ANOTHER1 = 1001; public static final int REQUEST_CODE_ANOTHER2 = 2002;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
public void onButton1Clicked(View v) { switch(v.getId()) { case R.id.button1: // 인텐트 객체를 만드는 방법 #1 // 인텐트 객체를 만듭니다. //getBaseContext(), getApplicationContext() 둘다 가능
//AnotherActivity1.class 대신 this를 사용하기도 하지만 Event에서는 this를 사용할 수 없다. Intent intent = new Intent(getBaseContext(), AnotherActivity1.class); //Intent intent = new Intent(getApplicationContext(), AnotherActivity1.class);
// 액티비티를 띄워주도록 startActivityForResult() 메소드를 호출합니다. // - startActivityForResult(Intent intent, int requestCode) // - requestCode : 띠운 AnotherActivity가 닫힐 때 startActivityForResult(intent, REQUEST_CODE_ANOTHER1); break; case R.id.button2: Intent intent2 = new Intent(getApplicationContext(), AnotherActivity2.class); startActivityForResult(intent2, REQUEST_CODE_ANOTHER2); break; }
// 인텐트 객체를 만드는 방법 #2 //Intent intent = new Intent(); //ComponentName name = new ComponentName("org.androidtown.intent.basic", "org.androidtown.intent.basic.AnotherActivity"); //intent.setComponent(name);
//startActivityForResult(intent, REQUEST_CODE_ANOTHER);
}
/** * 띄웠던 액티비티닫히면 자동 호출되는 메소드 * - requestCode : 이때 띄워주는 액티비티가 여러개 일때 어떤건지 구분하기 위한 값. * 띄워줄때 넘겨줫던 requestCode 값을 다시 받게 된다. * 그래야 어떤 화면에서 돌아 왔는지 알 수 있기 때문이다. */ protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == REQUEST_CODE_ANOTHER1) { Toast toast = Toast.makeText(getBaseContext(), "onActivityResult() 메소드가 호출됨. 요청코드 : " + requestCode + ", 결과코드 : " + resultCode, Toast.LENGTH_LONG); toast.show();
if (resultCode == RESULT_OK) { String name = intent.getExtras().getString("name"); toast = Toast.makeText(getBaseContext(), "응답으로 전달된 name : " + name, Toast.LENGTH_LONG); toast.show(); }else if (resultCode == RESULT_CANCELED) { toast = Toast.makeText(getBaseContext(), "오류 발생", Toast.LENGTH_LONG); toast.show(); }
}else if (requestCode == REQUEST_CODE_ANOTHER2) { Toast toast = Toast.makeText(getBaseContext(), "onActivityResult() 메소드가 호출됨. 요청코드 : " + requestCode + ", 결과코드 : " + resultCode, Toast.LENGTH_LONG); toast.show(); } } } |
[ AnotherActivity1.java ] , AnotherActivity2.java 도 동일하게 생성
public class AnotherActivity1 extends Activity { Button backButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.another1);
backButton = (Button) findViewById(R.id.backButton1); // 버튼을 눌렀을 때 메인 액티비티로 돌아갑니다. backButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 객체를 만듭니다. Intent resultIntent = new Intent(); resultIntent.putExtra("name", "mike");
// 응답을 전달하고 이 액티비티를 종료합니다. setResult(RESULT_OK, resultIntent); finish(); } }); } } |
[ activity_main.xml ]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="액티비티1 띄우기" android:textSize="10dp" android:onClick="onButton1Clicked"/> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="액티비티2 띄우기" android:textSize="10dp" android:onClick="onButton1Clicked"/> </LinearLayout>
<TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/button1" android:layout_marginTop="40dp" android:gravity="center_horizontal" android:text="위의 버튼을 누르면 새로운 액티비티가 띄워집니다." android:textSize="14dp" android:textColor="#ffad6535" /> </LinearLayout> |
[ another1.xml ], another2.xml 파일도 동일하게 생성
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="300dp" android:layout_height="400dp" >
<Button android:id="@+id/backButton1" android:layout_width="180dp" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="돌아가기" android:textSize="22dp"/> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/backButton1" android:layout_marginTop="20dp" android:gravity="center_horizontal" android:text="위의 버튼을 누르면 메인 액티비티로 돌아갑니다." android:textSize="14dp" android:textColor="#ffad6535" />
</RelativeLayout> |