안녕하세요?


이번 시간에는 서로다른 액티비티간에 인텐트라고 해야 할까요? 아무튼 데이터를 주고받고, 그것을 처리하는 과정을 실습해 보았고, 그 내용을 이번 포스팅에 쓰고자 합니다.


우선은 SampleIntent라고 하는 이름으로 새 프로젝트를 생성합니다. 그리고 Package explorer에서 우클릭을 해서, 새 액티비티를 생성하도록 합니다.



액티비티의 이름은 위에 올라온 스크린샷에서 보이는 것과 같이 MenuActivity라고 지정을 하도록 하였습니다. 그리고 나서 새로 생성한 액티비티의 레이아웃인 activity_menu.xml의 design탭으로 가서, 다음과 같이 show all properties를 눌러 theme항목을 본 다음, 아래처럼 dialog테마를 선택하였습니다.



위 스크린샷에서 밑줄을 친 부분이 제가 선택한 테마이며, OK버튼을 누르고 나면, 옆의 properties윈도우에서 해당하는 속성이 지정되어 있을 것입니다.



원래는 될수 있으면 activity_menu.xml에서 처리를 하려고 하였습니다만, label이라는 항목이 없어서 하는 수 없이 AndroidManifest.xml로 가서, MenuActivity아래에 다음과 같은 구문을 추가했습니다.


android:name="메뉴 액티비티"


이렇게 입력을 하고나면, 위에 올라온 우측의 스크린샷과 같이 액티비티의 상단에 있는 문구가 앱의 제목에서 지정한 문구로 바뀌는 것을 볼 수 있습니다.



다음은 activity_menu.xml의 design탭으로 가서, 버튼을 하나 추가합니다. 그리고 버튼의 onClick속성은 이후에 이어질 코딩작업을 위해서 지정을 하고, 버튼에는 [돌아가기]라는 글씨를 넣어주었습니다. 그리고 제약레이아웃이기에 버튼의 사방을 바깥선 테두리와 연결을 시켜 두었습니다.



다음은 MenuActivity.java로 가서 코딩작업을 한 것입니다. 버튼을 누르면 실행이 되도록 public void (onClick의 지정문구)는 하였는데, 아래의 문구는 다음과 같습니다.


Intent 변수이름 = New Intent();

변수이름.putExtra("Key",값);

setResult(RESULT_OK,변수이름);


여기서는 먼저 인텐트를 지정하고, 이후에 나오는 putExtra()메소드는 간단하게 인텐트에 데이터를 넣을 때 사용을 합니다. 여기서 "Key"는 뒤에 이어질 값의 종류...... 그러니까 이름이면 이름, 나이면 나이, 전화번호등 이 값이 무엇이다 라는 것을 나타내는 명칭이 되며, 항상 ""사이에 지정을 합니다.


이어지는 값은 숫자라면 그냥 타이핑을 해도 되지만, 문자열이 올 경우에는 반드시 ""사이에 지정을 해서 혼선을 피해야만 합니다.


다음으로 setResult()메서드는 새로 띄웠는 액티비티에서 이전 액티비티로 인텐트를 전달하고 싶을 때 사용하는 메서드입니다. 여기서 앞에 있는 RESULT_OK는 나중에 가면 나오는 resultCode라는 것이 되며, 뒤에 나오는 변수이름이 곧 인텐트로, 이것을 이전 액티비티에 전달하라는 의미가 됩니다.



다음은 activity_main.xml로 가서, 텍스트뷰와 버튼을 하나 추가합니다. 당연 여기서도 버튼의 onClick속성을 지정해서 뒤에 이어질 코딩작업에 대비하며, 제약 레이아웃이기 때문에 각각 컴포넌트의 외각선을 연결해서 서로의 위치를 지정해 두어야 합니다.



다음은 MainActivity.java로 가서 코딩작업을 시작하는 단계입니다. 위 스크린샷에서 붉은 색 밑줄을 친 부분은 바로 다른 액티비티를 띄우기 위한 요청코드를 정의하는 부분으로, 이번 실습에는 나오지 않았지만 책에서 나오기를 각각의 액티비티 별로 다른 요청코드(requestCode)를 지정해야 한다고 합니다.



다음은 버튼을 눌렀을 경우 다른 액티비티를 띄우기 위한 코드입니다. 여기서 이전과는 다르게 startActivityForResult()라는 메서드를 사용하는데, 이 메소드는 startActivity()와는 다르게 새로 띄운 액티비티로 부터 응답을 받을 수 있는 점이 다르다고 합니다.


Intent 변수이름 = new Intent(getApplicationContext(),띄우고자 하는 액티비티의 java파일 이름.class);

startActivityForResult(변수이름,미리 정의된 requestCode);


이 구문은 이런 식으로 사용을 하면 되는 것으로 생각이 듧니다. 그리고 나서 다음은 MainActivity 클래스 내에서 우클릭을 해서 아래와 같은 화면을 불러오도록 합니다.



여기서 Generate를 선택하면 아래와 같은 선택화면이 나오게 됩니다.



여기서는 Override Methods를 선택하여서, 나오는 목록에서 onActivityResult()라는 메소드를 찾아서 OK버튼을 누르도록 합니다. 이 메소드는 새로 띄웠던 액티비티가 응답을 보내오면, 그 응답을 받고서 처리하는 역할을 합니다.



다만 처음에 우클릭한 위치가 잘못되어서 @Override메소드가 너무 상단에 생겨버렸는데, 이러면 requestCode가 아직 정의되지 않은 상태에서 처리되어 무언가 에러를 일으키기 때문에, 가장 하단에 가되, MainActivity 클래스를 벗어나지 않는 곳에서 좀 전처럼 우클릭을 해서 onActivityResult()메소드를 생성하도록 합니다.



여기에 있는 코드는 정리하면 다음과 같습니다.여기 있는 if구문은 requestCode가 위에서 정의한 REQUEST_CODE_MENU와 같다면 다음과 같은 메세지를 띄우라는 것이 됩니다.


특징적인 것으로는 ""로 처리된 문구들 사이로 +표시로 연결된 변수이름들을 넣으면, 상황에 따라서 변수이름이 구문에 섞여서 나올 수 있다는 것입니다. 그 결과는 아랫쪽에 나올 앱을 실행시켜본 결과에서 확인을 할수 있습니다ㅣ.



다음은 이어져서 MenuActivity에서 보내온 resultCode가 지정된 RESULT_OK와 같다면, 아래에 지정된 문구와 같은 메세지를 띄우라는 의미가 됩니다. 여기서 주의할 점은, 위에서 먼저나온 if구문이 다 끝난것이 아니라는 것입니다. 그래서 결과를 보면 위에서 지정된 문장이 먼저 나오고, 그 다음에 아래에서 Toast로 지정된 문장이 나오게 됩니다.



마지막으로 USB에 연결된 스마트폰을 이용해서 나온 결과입니다. 결과적으로 제대로 액티비티간에 이동을 하였고, MainActivity로 돌아오고 난 다음에는 데이터가 전송되어 왔으므로, 위에 올려진 4개의 스크린샷 가운데 우측으로 2개의 스크린샷처럼 메세지가 뜨는 것을 확인할 수 있었습니다.


딱 하나....... MenuActivity는 팝업창 아니면 대화창처럼 띄우는 테마를 사용했는데, 그게 적용되지 않았습니다. 그래서 하는 수 없이 AndroidManifest.xml로 가서 다음과 같은 구문을 추가하였습니다.



위 스크린샷처럼 android:theme=""를 추가하여서 다시한번 USB에 연결이 된 스마트폰에서 앱을 실행시켜 보았습니다.



이번에는 제대로 된 대화상자 형태로 액티비티가 뜨는 것을 확인할 수 있었습니다. 이번 실습으로 어떻게 하면 액티비티의 스타일을 바꾸며, 액티비티(화면)간 이동하면서 서로 데이터를 주고받는 기능을 할 수 있는지를 알 수 있었습니다. 이번 포스팅에 올라온 20장의 스크린샷 만큼이나 한마디 말로는 간단하지만, 실제로는 상당히 이해가 바로 안되는 것이 액티비티간 데이터를 주고받는 것이라고 할 수 있을 듯 합니다.


+ Recent posts

티스토리 툴바