본문 바로가기
모바일개발(Mobile Dev)/안드로이드개발(Android)

send a data at a dialog

by 테크한스 2016. 10. 8.
반응형

written by http://www.masterqna.com/android/20899/%EB%8B%A4%EC%9D%B4%EC%96%BC%EB%A1%9C%EA%B7%B8%EB%A1%9C-%EA%B0%92-%EB%84%98%EA%B2%A8%EC%A3%BC%EA%B8%B0



 

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,650 포인트) 님이 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,880 포인트) 님이 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();
 



반응형