마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

다이얼로그로 값 넘겨주기.

+1 추천

 

A/B는 서로 다른 클래스 액티비티 입니당..[이말이 맞나?]

A는 A.java구요, B는 B.java 입니다.

A에는 커스텀 다이얼로그를 만들어서, 앱 시작 후,

A.java 페이지에서 다이얼로그 띄우기 버튼을 누르면 저 다이얼로그가 뜹니다. 

그림에선 가려졌지만, 다이얼로그 뒤에는 listview가 있는데요,

다이얼로그를 띄운 후, editText란에  이름을 입력하면 list에 제가 입력한 이름이 출력됩니다.[list에 add해서]

그리고, 다이얼로그에서 빨간버튼을 누르면 다른 페이지가 뜨는데요[ intent 사용]

B.java는 주소록?같은걸 만들 예정입니다. 라디오버튼으로 한 사람만 선택해서 해당 list의 id값을 받아서..

이름을 넘기는건 차차 할 예정인데, 그 것을 구현하기 전에.. B에서 A의 다이얼로그 editText에 값이 넘어오는지

확인하기 위해서 B의 확인버튼을 누르면 A의 editText.setText("B에서 넘어왔음"); 이런식으로 값을 넣어주려고 했습니다.

그 뒤에는 finish();로 B를 종료시키구요.

그런데 editText.setText("B에서 넘어왔음"); 에서 nullpointexception에러가 발생합니다.

변수명도 알맞게 넣었는데..말이죠.

커스텀다이얼로그의 editText를 다른 클래스?에서 받은 값으로 변경하고 싶은데, 이럴 때에는 어떻게 해야하는지요?

 

 

anci (19,950 포인트) 님이 2014년 2월 24일 질문

2개의 답변

0 추천
 
채택된 답변

먼저, A 액티비티의 다이얼로그에서 B 액티비티로 넘어갈때

Intent ai = new Intnet(A.this, B.class)

startActivityForResult(ai, 0) 를 사용해서 화면 전환하고

 

B 액티비티에서 작업 수행 후

Intent bi = new Intent()

bi.putExtra("test", "전달할문자열")

setResult(0, bi)

finish()

로 A 액티비티에 내용을 전달함

 

그럼 A 액티비티에서 get 으로 내용을 받아서 화면에 표시.

onActivityResult () 함수를 써서

if(resultCode==0)  // 아까 인텐트 호출시 사용했던 숫자

// 아까 test 라는 key에 대입한 값을 에디트텍스트에 표시.

editText.setText(data.getStringExtra("test"))

 

뭐 이런식으로 인텐트 사용하시면 좋을 것 같네요 '-' 데이터는 put/get으로 전달하구요

초보개발자ㅠ (33,870 포인트) 님이 2014년 2월 24일 답변
anci님이 2014년 2월 24일 채택됨
답변 감사합니다. 인터넷에서 onActivityResult () 에 대해 검색해봤는데,
그럼 이 함수를 호출하는 시기는 언제가 되어야 하는건가요?
B가 종료되고, 다시 A로 넘어가는 시점에서 되어야 하는건가요..?
A에서 B로 넘어가는 건 커스텀다이얼로그 내에서 onclick 이벤트로 빨간 버튼을 눌렀을 때, 다시 부르는건 어디쯤 놓아야 하는지요?
음.. 살짝 부연설명드리면
onActivityResult()는 startActivityForResult와 함께 사용되는 함수에요
호출은 직접하시는게 아니고 호출한 액티비티가 종료되면 자동으로 호출되는 함수이지요~ 그러니까 생명주기의 함수처럼 A클래스의 액티비티에 추가해두시면 되요 양식은 지정되어있구요. 아래의 링크를 참조하세요

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {     
super.onActivityResult(requestCode, resultCode, data);           
// 수행을 제대로 한 경우     
    if(resultCode == RESULT_OK && data != null)     {         
           String result = data.getStringExtra("resultSetting");                
        }     // 수행을 제대로 하지 못한 경우     
   else if(resultCode == RESULT_CANCELED)    
      {                          
       }
}

http://croute.tistory.com/352
추가로 int requestCode, int resultCode 두개의 인자가 있는데

클래스를 호출할때 사용하는 인자가 requestCode 이구요
startActivityForResult ( 인텐트, 리퀘스트코드★)

resultCode는 호출한 액티비티의 종료 상태를 알려주는 인자로
finish()를 사용해서 종료하게되면 RESULT_OK 값을 반환합니다.

그러니까 일반적으로
RESULT_OK를 먼저 확인 후
리퀘스트코드에 따라 이벤트를 지정해주시면 됩니당~
초보개발자님 감사합니다!
A.java 맨 밑에 onActivityResult 추가해서, 위의 예제를 토대로 resultcode도 알맞게 수정했더니 되네요 ~! B에서 확인버튼 누르면 finish로 종료됨과 동시에 커스텀 다이얼로그 editText에 제가 원하는 값이 들어옵니다.ㅎㅎ 감사합니다~!
잘 해결하셨다니 저도 기쁘네요 ^^ 홧팅임다~!!
+1 추천

이런류의 설명글은 1. 2, 3, 4, 를 적어주면 보기 편할 것 같네요

 

다이얼로그를 띄운 뒤 ok 에 해당하는 리스너를 a activity 에 등록하면 ok 시 값이 넘어오게 되어 b activity 를 띄울 때 해당 값을 전달하는 방법을 이용하시면 될 듯 합니다.

 

대충 

@Override
public void onClick(View v) {
    if (v.getId() == left.getId()) {
        String res = edit.getText().toString();
        if (res.length() == 0) {
            if (listener != null) {
                listener.error();
            }
 
            return ;
        }
 
        if (listener != null) {
            listener.ok(res);
        }
 
        dismiss();
    } else {
        dismiss();
    }
}
 
public void setOnEditListener(DlgEditListenr l) {
    listener = l;
}
 
 public interface DlgEditListenr {
    public void ok(String value);
    public void error();
 
이런 식인거죠
aucd29 (218,390 포인트) 님이 2014년 2월 24일 답변
...