한 활동의 ​​값을 이전 활동으로 전달하는 방법


97

한 화면에서 이전 화면으로 값을 어떻게 전달합니까?

이 경우를 고려하십시오. 두 가지 활동이 있습니다. 첫 번째 화면에는 하나 TextView와 단추가 있고 두 번째 활동에는 하나 EditText와 단추가 있습니다.

첫 번째 버튼을 클릭하면 두 번째 활동으로 이동해야하며 여기에서 사용자는 텍스트 상자에 무언가를 입력해야합니다. 두 번째 화면에서 버튼을 누르면 텍스트 상자의 값이 첫 번째 활동으로 이동해야하며 첫 번째 활동에 표시되어야합니다 TextView.



답변:


240

한 활동에서 수행 된 작업을 다른 활동에서 캡처하려면 세 단계가 필요합니다.

startActivityForResult기본 활동에서 사용하여 보조 활동 ( '텍스트 편집'활동)을 하위 활동으로 시작하십시오.

Intent i = new Intent(this,TextEntryActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

사용자가 버튼을 클릭 할 때 액티비티를 닫는 것이 아니라 하위 액티비티 내에서 새 인 텐트를 만들고 입력 된 텍스트 값을 추가 번들에 포함해야합니다. 보조 활동을 닫기 위해 호출 setResult하기 전에 부모 호출로 다시 전달합니다 finish.

Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

마지막 단계는 Activity : Override onActivityResult를 호출 하여 텍스트 항목 Activity에서 콜백을 수신하는 것입니다. 반환 된 Intent에서 추가를 가져와 표시해야하는 텍스트 값을 가져옵니다.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
    case (STATIC_INTEGER_VALUE) : { 
      if (resultCode == Activity.RESULT_OK) { 
      String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
      // TODO Update your TextView.
      } 
      break; 
    } 
  } 
} 

27
이것은 new Intent(null);"너무 모호한" 것을 제외하고 는 모두 나를 위해 일 했고 나는 그것을 new Intent();.
Richard Tingle 2014-07-02

1
이것은 동일한 컨텍스트 내에서만 작동한다는 점도 주목할 가치가 있습니다. 예를 들어 조각에서 활동을 시작하면 requestCode가 매번 달라지기 때문에 작동하지 않습니다. 조각에서 getActivity (). startActivityForResult ()를 사용해야합니다.
stef dec

10

다른 클래스 또는 활동의 변수 또는 개체에 액세스 할 수있는 몇 가지 방법이 있습니다.

A. 데이터베이스

B. 공유 선호도.

C. 객체 직렬화.

D. 공통 데이터를 보유 할 수있는 클래스는 사용자에 따라 공통 유틸리티로 명명 될 수 있습니다.

E. 인 텐트 및 Parcelable 인터페이스를 통한 데이터 전달.

프로젝트 요구 사항에 따라 다릅니다.

A. 데이터베이스

SQLite는 Android에 내장 된 오픈 소스 데이터베이스입니다. SQLite는 SQL 구문, 트랜잭션 및 준비된 문과 같은 표준 관계형 데이터베이스 기능을 지원합니다.

자습서-http: //www.vogella.com/articles/AndroidSQLite/article.html

B. 공유 기본 설정

사용자 이름을 저장한다고 가정합니다. 이제 사용자 이름, 값 이라는 두 가지가 있습니다 .

보관 방법

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

putString (), putBoolean (), putInt (), putFloat (), putLong ()을 사용하여 원하는 dtatype을 저장할 수 있습니다.

가져 오는 방법

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

C. 객체 직렬화

Object serlization은 객체 상태를 저장하여 네트워크를 통해 전송하거나 목적에 맞게 사용할 수있는 경우에 사용됩니다.

Java Bean을 사용하고 필드 중 하나로 저장하고 getter 및 setter를 사용하십시오.

JavaBeans는 속성이있는 Java 클래스입니다. 속성을 개인 인스턴스 변수로 생각하십시오. 비공개이므로 클래스 외부에서 액세스 할 수있는 유일한 방법은 클래스의 메서드를 통해서입니다. 속성 값을 변경하는 메서드를 setter 메서드라고하고 속성 값을 검색하는 메서드를 getter 메서드라고합니다.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

사용하여 메일 방법에 변수를 설정하십시오.

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

그런 다음 개체 Serialzation을 사용하여이 개체를 직렬화하고 다른 클래스에서이 개체를 역 직렬화합니다.

직렬화에서 객체는 객체의 데이터뿐만 아니라 객체 유형 및 객체에 저장된 데이터 유형에 대한 정보를 포함하는 바이트 시퀀스로 표현 될 수 있습니다.

직렬화 된 객체가 파일에 기록 된 후에는 파일에서 읽고 직렬화 해제 할 수 있습니다. 즉, 객체와 해당 데이터를 나타내는 유형 정보와 바이트를 사용하여 메모리에서 객체를 다시 만들 수 있습니다.

이 튜토리얼을 원한다면이 링크를 참조하십시오.

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

다른 클래스에서 변수 가져 오기

디. CommonUtilities

프로젝트에서 자주 필요한 공통 데이터를 담을 수있는 수업을 스스로 만들 수 있습니다.

견본

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. 인 텐트를 통한 데이터 전달

이 데이터 전달 옵션에 대해서는이 튜토리얼을 참조하십시오.

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/


6

그럴 필요 없어 ...

두 번째 활동에서 newIntent ()를 호출하십시오.

Intent retData=new Intent();

다시 전달할 데이터 추가

putExtras (retData.putExtra("userName", getUsrName()));

setResult로 진행하십시오.

setResult(RESULT_OK, retData);

그리고 끝낼 수 있습니다

finish();


2

나는 종종 정적 setter 메서드와 함께 호출 활동에서 정적 변수를 사용하여 설정합니다.

이런 식으로 다양한 활동 간의 정확한 제어 흐름에 관계없이 모든 활동의 값을 마음대로 변경할 수 있습니다.

이 트릭은 응용 프로그램에서 동일한 활동 (클래스)의 두 개 이상의 복사본을 인스턴스화하는 데 관심이없는 경우에만 사용할 수 있지만 구현하기 가장 쉬운 방법이며 가장 많이 사용합니다. .


훌륭한 솔루션이 아닙니다. 이것은 Android의 모범 사례에 위배됩니다. 활동이 종료되지 않고 시스템에 의해 새 인스턴스가 시작되지 않을 것이라고 보장 할 수 없습니다.
SIr Codealot

0

여기서 가장 좋은 방법은 범위 외부에서 정의 된 공통 클래스에 변수를 넣는 것입니다.

public class Utils 
{
    public static String mPosition;
}

코드 내부 (예 : OnButtonClick 등)

Intent intent = new Intent(Intent.ACTION_PICK, 
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);

코드 내부

@Override public void onActivityResult (int requestCode, int resultCode, Intent data) {if (requestCode == Keys.PICK_CONTACT) {if (resultCode == Activity.RESULT_OK) {Uri contactData = data.getData ();

            //you may use the variable here after intent result
            LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.