Android에서 기본 활동으로 데이터 다시 보내기
저는 두 가지 활동이 있습니다: 주요 활동과 어린이 활동.
기본 활동에서 버튼을 누르면 하위 활동이 시작됩니다.
이제 몇 가지 데이터를 메인 화면으로 다시 보내고 싶습니다.번들 클래스를 사용했는데 작동하지 않습니다.일부 런타임 예외를 슬로우합니다.
이것에 대한 해결책이 있습니까?
상황에 따라 원하는 것을 달성할 수 있는 몇 가지 방법이 있습니다.
가장 일반적인 시나리오는 목록에서 연락처를 선택하거나 대화상자에 데이터를 입력하는 등 하위 활동을 사용하여 사용자 입력을 받는 경우입니다.이 경우 를 사용하여 하위 활동을 시작해야 합니다.
를 사용하여 데이터를 주 활동으로 다시 보내기 위한 파이프라인을 제공합니다.setResult 메서드는 호출 활동에 전달되는 int 결과 값과 intent를 가져옵니다.
Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data");
setResult(Activity.RESULT_OK, resultIntent);
finish();
override에서 반환된 은 다음과 같습니다.onActivityResult
합니다.startActivityForResult
및 Activitycall에서 , code 및 data Intent는 code입니다.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (MY_CHILD_ACTIVITY) : {
if (resultCode == Activity.RESULT_OK) {
// TODO Extract the data returned from the child Activity.
String returnValue = data.getStringExtra("some_key");
}
break;
}
}
}
활동 1은 결과에 대해 startActivityForResult를 사용합니다.
startActivityForResult(ActivityTwo, ActivityTwoRequestCode);
활동 2가 시작되면 작업을 수행하여 활동을 종료할 수 있습니다.
Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();
활동 1 - 이전 활동에서 복귀하면 활동 결과를 호출합니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
num1 = data.getIntExtra(Number1Code);
num2 = data.getIntExtra(Number2Code);
}
}
업데이트: Seenu69의 코멘트에 대한 답변, 활동 2에서,
int result = Integer.parse(EditText1.getText().toString())
+ Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);
그리고 첫 번째 활동에서는
int result = data.getExtra(KEY_RESULT);
데이터 다시 보내기
상황에 맞게 사물을 보는 데 도움이 됩니다.여기 데이터를 다시 보내기 위한 완전하고 간단한 프로젝트가 있습니다.xml 레이아웃 파일을 제공하는 대신 이미지가 있습니다.
기본 활동
- 로 두 번째
startActivityForResult
임의의 결과 코드를 제공합니다. - 재정의
onActivityResult
두 번째 활동이 완료되면 이를 호출합니다.요코드확인실여제두로번활확수다있니습인할지동 ( 주요 에서 여러 다른 할 때 합니다.(이것은 동일한 기본 활동에서 여러 개의 다른 활동을 시작할 때 유용합니다.) - 합니다.
Intent
데이터는 키-값 쌍을 사용하여 추출됩니다.
기본 활동.java
public class MainActivity extends AppCompatActivity {
private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// "Go to Second Activity" button click
public void onButtonClick(View view) {
// Start the SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
}
// This method is called when the second activity finishes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Check that it is the SecondActivity with an OK result
if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Get String data from Intent
String returnString = data.getStringExtra("keyName");
// Set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
두 번째 활동
- 를 전활동로다보데는이넣다습다니음에를터내려이에 넣습니다.
Intent
는 데는다저니다에 됩니다.Intent
키-값 쌍을 사용합니다. - 를 과결설로 합니다.
RESULT_OK
데이터를 보관할 목적을 추가합니다. - 러
finish()
두 번째 활동을 닫습니다.
두 번째 활동.java
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
// "Send text back" button click
public void onButtonClick(View view) {
// Get the text from the EditText
EditText editText = (EditText) findViewById(R.id.editText);
String stringToPassBack = editText.getText().toString();
// Put the String to pass back into an Intent and close this activity
Intent intent = new Intent();
intent.putExtra("keyName", stringToPassBack);
setResult(RESULT_OK, intent);
finish();
}
}
기타 참고 사항
- 만약 당신이 프래그먼트에 있다면 그것은 의미를 알지 못할 것입니다.
RESULT_OK
전체 이름을 하세요: 전체이사용됩니다면하름을.Activity.RESULT_OK
.
참고 항목
- 데이터 전달을 포함한 전체 답변
- 키 문자열에 대한 명명 규칙
첫 번째 활동은 결과에 대해 startActivityForResult를 사용합니다.
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int requestCode); // suppose requestCode == 2
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2)
{
String message=data.getStringExtra("MESSAGE");
}
}
두 번째 활동에서 클릭 이벤트 또는 BackPressed()에 대해 setResult()를 호출합니다.
Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(Activity.RESULT_OK, intent);
2021년 3월 업데이트
활동 v1.2.0 및 fragment v1.3.0에서와 같이 새로운Activity Result APIs
소개되었습니다.
Activity Result API는 결과를 등록하고, 결과를 시작하며, 시스템에서 결과를 발송한 후 처리하기 위한 구성 요소를 제공합니다.
따라서 사용할 필요가 없습니다.startActivityForResult
그리고.onActivityResult
더이상.
새 API를 사용하려면 오리진 활동에 ActivityResultLauncher를 생성하여 대상 활동이 완료되고 원하는 데이터를 반환할 때 실행할 콜백을 지정해야 합니다.
private val intentLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
result.data?.getStringExtra("key1")
result.data?.getStringExtra("key2")
result.data?.getStringExtra("key3")
}
}
그런 다음 다음 필요할 때마다 의도를 실행합니다.
intentLauncher.launch(Intent(this, YourActivity::class.java))
그리고 대상 활동에서 데이터를 반환하려면 값을 사용하여 의도를 추가하면 됩니다.setResult()
방법:
val data = Intent()
data.putExtra("key1", "value1")
data.putExtra("key2", "value2")
data.putExtra("key3", "value3")
setResult(Activity.RESULT_OK, data)
finish()
자세한 내용은 Android 설명서를 참조하십시오.
startActivityForResult() 메서드 호출을 사용하여 하위 활동 Intent를 호출합니다.
여기에 이러한 예가 있습니다. http://developer.android.com/training/notepad/notepad-ex2.html
그리고 이것의 "화면에서 결과 반환"에서: http://developer.android.com/guide/faq/commontasks.html#opennewscreen
당신이 더 잘 참고할 수 있도록 간단한 데모 클래스를 만들었습니다.
첫 번째 활동.java
public class FirstActivity extends AppCompatActivity {
private static final String TAG = FirstActivity.class.getSimpleName();
private static final int REQUEST_CODE = 101;
private Button btnMoveToNextScreen;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(mIntent, REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if(requestCode == REQUEST_CODE && data !=null) {
String strMessage = data.getStringExtra("keyName");
Log.i(TAG, "onActivityResult: message >>" + strMessage);
}
}
}
}
그리고 여기 두 번째 활동.java가 있습니다.
public class SecondActivity extends AppCompatActivity {
private static final String TAG = SecondActivity.class.getSimpleName();
private Button btnMoveToPrevious;
private EditText editText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
editText = (EditText) findViewById(R.id.editText);
btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = editText.getEditableText().toString();
Intent mIntent = new Intent();
mIntent.putExtra("keyName", message);
setResult(RESULT_OK, mIntent);
finish();
}
});
}
}
첫 번째 활동에서 다음을 사용하여 의향서를 보낼 수 있습니다.startActivityForResult()
두 에 결과를 .setResult
.
기본 활동.클래스
public class MainActivity extends AppCompatActivity {
private static final int SECOND_ACTIVITY_RESULT_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// "Go to Second Activity" button click
public void onButtonClick(View view) {
// Start the SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
// send intent for result
startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE);
}
// This method is called when the second activity finishes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// check that it is the SecondActivity with an OK result
if (requestCode == SECOND_ACTIVITY_RESULT_CODE) {
if (resultCode == RESULT_OK) {
// get String data from Intent
String returnString = data.getStringExtra("keyName");
// set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
Second Activity.class
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
// "Send text back" button click
public void onButtonClick(View view) {
// get the text from the EditText
EditText editText = (EditText) findViewById(R.id.editText);
String stringToPassBack = editText.getText().toString();
// put the String to pass back into an Intent and close this activity
Intent intent = new Intent();
intent.putExtra("keyName", stringToPassBack);
setResult(RESULT_OK, intent);
finish();
}
}
이 모든 답변은 데이터 전송 후 두 번째 활동을 완료해야 하는 시나리오를 설명합니다.
그러나 두 번째 작업을 완료하지 않고 데이터를 먼저 에 다시 보내고 싶다면 BroadCastReceiver를 사용할 수 있습니다.
두 번째 활동 -
Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
첫 번째 활동에서
private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do some action
}
};
Create()에 수신기를 등록합니다.
LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));
Destroy()에서 등록 취소
상황에 따라 더 나은 원하는 결과를 얻을 수 있는 또 다른 방법은 수신기 인터페이스를 만드는 것입니다.
필요한 데이터를 매개 변수로 전달하는 동안 부모 활동이 자식 활동에 의해 트리거되는 인터페이스에 귀를 기울이게 함으로써 유사한 일련의 상황을 만들 수 있습니다.
이를 수행하는 몇 가지 방법이 있습니다. 1. 위의 답변에서 매우 잘 설명된 startActivityForResult()를 사용합니다.
"Utils" 클래스 또는 자신의 다른 클래스에서 정적 변수를 생성합니다.예를 들어 활동 B에서 활동 A로 studentId를 전달하고자 합니다.먼저 저의 활동 A는 활동 B를 부르는 것입니다.그런 다음 활동 B 내부에서 studentId(Utils.class의 정적 필드)를 설정합니다.이런 Utils.STUDEN_ID="1234". 활동 A로 돌아가는 동안 Utils에 저장된 studentId를 사용합니다.학생_ID.
응용 프로그램 클래스에서 getter 및 setter 메서드를 생성합니다.
다음과 같이:
public class MyApplication extends Application {
private static MyApplication instance = null;
private String studentId="";
public static MyApplication getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public void setStudentId(String studentID){
this.studentId=studentID;
}
public String getStudentId(){
return this.studentId;
}
}
당신이 활동 B에 있을 때 안에 데이터를 설정하고 활동 A로 돌아온 후에 데이터를 가져오세요.
위의 답변에서 누락된 것으로 생각되는 작은 세부 사항입니다.
여러 부모 활동에서 자녀 활동을 열 수 있는 경우 필요한지 확인할 수 있습니다.setResult
당신의 활동이 다음에 의해 열렸는지 여부를 기준으로 합니다.startActivity
또는startActivityForResult
다음을 사용하여 이를 달성할 수 있습니다.getCallingActivity()
자세한 내용은 여기.
공유 기본 설정을 사용하여 데이터를 저장하고 응용프로그램의 모든 위치에서 액세스할 수 있습니다.
이렇게 날짜를 저장합니다.
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key, value);
editor.commit();
그리고 다음과 같은 데이터를 받습니다.
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
String savedPref = sharedPreferences.getString(key, "");
mOutputView.setText(savedPref);
언급URL : https://stackoverflow.com/questions/920306/sending-data-back-to-the-main-activity-in-android
'programing' 카테고리의 다른 글
판다의 이미지 크기를 늘리는 방법데이터 프레임.줄거리. (0) | 2023.08.14 |
---|---|
imshow in matplotlib에 의해 표시된 영상 반전 (0) | 2023.08.14 |
줄 간격 설정 (0) | 2023.08.14 |
지연 후 Selector:withObject:를 수행하는 대신 블록: (0) | 2023.08.14 |
Javascript / jQuery를 통해 Android 전화기 탐지 (0) | 2023.08.14 |