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


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.