다시 누를 때 두 번째 활동에서 첫 번째 활동으로 데이터를 전달하는 방법은 무엇입니까? -안드로이드


185

나는이 개 활동했습니다 activity1에activity2에를 .

에서 Activity1나는했습니다 버튼텍스트 뷰를 . 버튼을 클릭하면 Activity2 가 시작됩니다.

에서 Activity2나는했습니다 글고 치기를 .

나는에서 검색 한 데이터를 표시 할 글고 치기activity2에텍스트 뷰 에서 activity1에 다시가에서 눌렀을 때 activity2에를 .

누군가 가이 작업을 수행하는 코드를 도와 줄 수 있습니까?


2
읽어보기startActivityForResult
Dmitry Zaytsev


다른 방법 : Activity2영구 저장소에 값을 넣고 Activity1거기서 읽습니다.
Henry

@kumareloaded : 여기에서 솔루션을 공유하십시오. 현재 Pastebin이 우리나라에서 작동하지 않습니다.
user1903022 2016 년

답변:


327

Activity2를 시작하고 Activity2 에서 Activity1로 데이터를 다시 보내는 방법을 startActivityForResult사용 하십시오 setResult. activity1에 당신은 오버라이드 (override) 할 필요가 onActivityResult갱신 TextViewEditTextactivity2에 데이터.

예를 들면 다음과 같습니다.

에서 activity1에 , activity2에를로 시작합니다 :

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, 1);

에서 activity2에 사용 setResult데이터를 전송은 백업 :

Intent intent = new Intent();
intent.putExtra("editTextValue", "value_here")
setResult(RESULT_OK, intent);        
finish();

그리고 Activity1 에서 다음을 사용하여 데이터를 수신하십시오 onActivityResult.

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             String strEditText = data.getStringExtra("editTextValue");
         }     
    }
} 

가능하면 활동간에 데이터를 공유 하기 위해 SharedPreferences 도 사용하십시오 .


1
고맙습니다, 당신이 SharedPreferences에 대해 비슷한 코딩 부분을 도울 수 있다면 :)
kumareloaded

1
@kumareloaded : 가장 환영하는 친구. 을 사용하여 동일한 작업을 수행 SharedPreferences하려면 다음 예제 를 참조하십시오
ρяσѕρєя K

2
@kumareloaded : pastebin.com 을 사용하여 시도한 것과 두 클래스의 코드 링크를 제공하면 코드 를 편집 할 것입니다.
ρяσѕρєя K

1
지금 사용 @kumareloaded 코드를이 작동합니다
K ρяσѕρєя

1
@ ρяσѕρєяK : 답변에 SharedPref를 사용하여 위 시나리오에 대한 코드를 공유해 주시겠습니까? Pastebin은 많은 국가에서 열리지 않습니다. 여기에 공유하면 큰 도움이 될 것입니다. 감사합니다.
user1903022 2016 년

26

activity1에는 시작해야 activity2에를startActivityForResult().

activity2에이 사용해야 setResult()에 다시 데이터를 전송하는 activity1에 .

에서 activity2에 ,

@Override
public void onBackPressed() {
    String data = mEditText.getText();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(resultcode, intent);
}

에서 activity1에 ,

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}

@Swayam 나는 activity1에 대해 언급하지 않았기 때문에 startactivityforresult로 activity2를 시작해야한다고 생각합니다.
LutfiTekin

1
@LutfiTekin : 그럴 수 있습니다! 지적 해 주셔서 감사합니다! 내 답변을 수정했습니다. :)
Swayam

17

나는 둘 때 다른 답변이 작동되지 않은 setResult에서 onBackPressed. 수퍼에 대한 통화에 주석을 달고 수동으로 onBackPressed전화 finish하면 문제가 해결됩니다.

@Override
public void onBackPressed() {
    //super.onBackPressed();
    Intent i = new Intent();
    i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
    setResult(RESULT_OK, i);
    finish();
}

그리고 첫 번째 활동에서 :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == QUEUE_MSG) {
        if (resultCode == RESULT_OK) {
            Serializable tmp = data.getSerializableExtra(MainActivity.EXTRA_NON_DOWNLOADED_PAGES);
            if (tmp != null)
                serializable = tmp;
        }
    }
}

6

이를 startActivityforResult의 대안으로 사용하십시오. 그러나 이러한 경우이 방법은 성능면에서 비쌀 수 있지만 경우에 따라 사용해야 할 수도 있습니다.

Activity2에서

@Override
public void onBackPressed() {
String data = mEditText.getText();
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
Editor editor = sp.edit();
editor.putString("email",data);
editor.commit();
}

Activity1에서

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 

객체 (문자열, 부울 등)에는 사용할 수 없습니다.
FindOut_Quran

1
필자의 경우 MainActivity의 목록 항목에서 활동을 시작하고 사용자가 만든 데이터를 해당 목록 항목으로 다시 가져오고 싶었습니다. mContext.startActivity ()를 사용하는 경우 startActivityForResult ()를 사용할 수 없습니다. @katmanco 예제는 도움이되는 해결 방법이었습니다.
Faulty

나의 선택은 나쁜 선거입니다. 존재 actionForResult
marlonpya

2

이것이 첫 번째 Activity1입니다.

public class Activity1 extends Activity{
private int mRequestCode = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, Activity2.class);
    startActivityForResult(intent, mRequestCode);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == mRequestCode && resultCode == RESULT_OK){
        String editTextString = data.getStringExtra("editText");
    }
}
}

여기에서 startActivityForResult (mRequestCode, Activity2.class);를 사용하여 Activity2.class를 시작합니다 .

이제 두 번째 활동입니다. 이름은 Activity2입니다.

public class Activity2 extends Activity {
private EditText mEditText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //mEditText = (EditText)findViewById(R.id.edit_text);

    Intent intent = new Intent();
    intent.putExtra("editText", mEditText.getText().toString());
    setResult(RESULT_OK, intent);
}

}

이제 두 번째 활동으로 끝나면 setBack () 메소드, onBackPress () 또는 Activity2가 파괴 될 때의 버튼 클릭에서 Activity1의 콜백 메소드 onActivityResult () 가 호출됩니다. ..

그것이 당신에게 도움이되기를 바랍니다 :)



2

FirstActivity에서 startActivityForResult () 메소드를 사용하여 SecondActivity를 호출하십시오.

예를 들면 다음과 같습니다.

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

SecondActivity에서 FirstActivity로 되돌리려는 데이터를 설정하십시오. 되돌아 가기를 원하지 않으면 아무 것도 설정하지 마십시오.

예를 들면 다음과 같습니다. secondActivity에서 데이터를 다시 보내려는 경우 :

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

데이터를 반환하지 않으려는 경우 :

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

이제 FirstActivity 클래스에서 onActivityResult () 메소드에 대한 다음 코드를 작성하십시오.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}

1

TL; DR 사용 Activity.startActivityForResult

긴 대답 :

먼저 Android 개발자 문서를 읽으십시오. 특히 문제의 주제 Starting Activities and Getting ResultsActivity설명서 의 섹션 에서 다룹니다 .

예제 코드와 같이 Android SDK는 좋은 예제를 제공합니다. 또한 다른 답변은 사용할 샘플 코드 스 니펫을 제공합니다.

그러나 대안을 찾고 있다면 이 SO 질문을 읽으십시오 . 이것은 startActivityForResults프래그먼트와 함께 사용하는 방법 과 활동간에 데이터를 전달하는 몇 가지 방법에 대한 좋은 토론입니다 .


0

그리고 나는 내가 만든 소프트 버튼과 모든 안드로이드 장치에서 기본값 인 softKey 에서이 데이터 유형을 전송하고 싶었던 문제가 있습니다. 그래서 먼저이 작업을 수행 Intent했습니다. "A" Activity:

            Intent intent = new Intent();
            intent.setClass(context, _AddNewEmployee.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, 6969);
            setResult(60);

그런 다음 두 번째 활동에서 "B"에 Field를 선언했습니다 Activity.

private static int resultCode = 40;

나는 성공적으로 내 요청을하거나 나는이 작업이 성공적으로 동일한 I의 한에의 resultCode의 값을 변경 여기 수행하고있는 "A"활동을 말하려고 할 때마다 "A"고 말했다 후 후 Activity내 경우에는 "60"인과 그때:

private void backToSearchActivityAndRequest() {
    Intent data = new Intent();
    data.putExtra("PhoneNumber", employeePhoneNumber);
    setResult(resultCode, data);
    finish();
}

@Override
public void onBackPressed() {
    backToSearchActivityAndRequest();
}

추신 : Super올바르게 작동하려면 onBackPressed 메소드에서 를 제거하십시오 .

그런 다음 onActivityResult"A"활동에서 메소드를 호출해야 합니다.

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 6969 && resultCode == 60) {
            if (data != null) {
                    user_mobile = data.getStringExtra("PhoneNumber");
                    numberTextField.setText(user_mobile);
                    getEmployeeByNumber();
            }
        }
    }

그것이 당신을 도울 수 있기를 바랍니다. #HappyCoding;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.