주요 활동과 아동 활동이라는 두 가지 활동이 있습니다.
주 활동에서 버튼을 누르면 하위 활동이 시작됩니다.
이제 일부 데이터를 기본 화면으로 다시 보내려고합니다. 번들 클래스를 사용했지만 작동하지 않습니다. 런타임 예외가 발생합니다.
이에 대한 해결책이 있습니까?
주요 활동과 아동 활동이라는 두 가지 활동이 있습니다.
주 활동에서 버튼을 누르면 하위 활동이 시작됩니다.
이제 일부 데이터를 기본 화면으로 다시 보내려고합니다. 번들 클래스를 사용했지만 작동하지 않습니다. 런타임 예외가 발생합니다.
이에 대한 해결책이 있습니까?
답변:
상황에 따라 원하는 것을 달성하는 몇 가지 방법이 있습니다.
가장 일반적인 시나리오 (사운드처럼 들리는 방법)는 목록에서 연락처를 선택하거나 대화 상자에 데이터를 입력하는 등의 하위 활동을 사용하여 사용자 입력을 얻는 경우입니다. 이 경우 startActivityForResult
자녀 활동을 시작 하는 데 사용해야 합니다.
이는를 사용하여 데이터를 기본 활동으로 다시 보내기위한 파이프 라인을 제공합니다 setResult
. 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();
호출 활동 대체에서 리턴 된 데이터에 액세스하려면 onActivityResult
. requestCode는 startActivityForResult
호출에 전달 된 정수에 해당하는 반면 resultCode 및 data Intent는 하위 Activity에서 리턴됩니다.
@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;
}
}
}
startActivityForResult
그냥 대신 함수 를 사용해야합니다 startActivity
. 예를 들어 startActivityForResult(myIntent, 2);
2는 결과 코드이며 위의 MY_CHILD_ACTIVITY
switch 문에서 대신 할 수 있습니다 .
활동 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-이전 활동에서 돌아 오면 onActivityResult 가 호출됩니다 .
@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);
그런 다음 활동 1에서
int result = data.getExtra(KEY_RESULT);
상황에 맞는 것을 볼 수있게 도와줍니다. 다음은 데이터를 다시 보내기위한 완벽한 간단한 프로젝트입니다. xml 레이아웃 파일을 제공하는 대신 이미지가 있습니다.
startActivityForResult
임의의 결과 코드를 제공하십시오.onActivityResult
. 두 번째 활동이 완료되면 호출됩니다. 요청 코드를 확인하여 실제로 두 번째 활동인지 확인할 수 있습니다. (이것은 동일한 기본 활동에서 여러 다른 활동을 시작할 때 유용합니다.)Intent
. 데이터는 키-값 쌍을 사용하여 추출됩니다.MainActivity.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()
두 번째 활동을 마치려면 전화하십시오 .SecondActivity.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
.FirstActivity는 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");
}
}
SecondActivity 호출시 setResult () onClick 이벤트 또는 onBackPressed ()
Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(Activity.RESULT_OK, intent);
startActivityForResult () 메소드 호출을 사용하여 하위 활동 의도를 호출하십시오.
여기에 예가 있습니다 : http://developer.android.com/training/notepad/notepad-ex2.html
및 "화면에서 결과 반환": http://developer.android.com/guide/faq/commontasks.html#opennewscreen
더 나은 참조를 위해 간단한 데모 클래스를 만들었습니다.
FirstActivity.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);
}
}
}
}
그리고 여기 SecondActivity.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();
}
});
}
}
첫 번째 활동에서 u를 사용하여 의도를 보낸 startActivityForResult()
다음 사용을 마친 후 두 번째 활동에서 결과를 얻을 수 있습니다.setResult
.
MainActivity.class
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);
}
}
}
}
SecondActivity.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
}
};
onCreate ()에 수신자를 등록하십시오.
LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));
onDestroy ()에서 등록 해제
이를 수행하는 몇 가지 방법이 있습니다. 1. 위의 답변에서 잘 설명 된 startActivityForResult ()를 사용하여.
"Utils"클래스 또는 다른 클래스에서 정적 변수를 작성합니다. 예를 들어, StudentId를 ActivityB에서 ActivityA로 전달하고 싶습니다. 먼저 내 ActivityA가 ActivityB를 호출합니다. 그런 다음 ActivityB 내부에서 studentId (Utils.class의 정적 필드)를 설정하십시오. 이와 같이 Utils.STUDENT_ID = "1234"; 그런 다음 ActivityA로 돌아 오는 동안 Utils.STUDENT_ID에 저장된 studentId를 사용하십시오.
애플리케이션 클래스에서 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;
}
}
그래서 당신은 끝났습니다. u가 ActivityB에있을 때 내부 데이터를 설정하고 ActivityA로 돌아온 후 데이터를 가져옵니다.
위의 답변에서 누락 된 것으로 생각되는 작은 세부 사항입니다.
자녀의 활동이 여러 부모 활동에서 열 수 있다면 당신이 할 필요가 있다면 당신은 확인하실 수 있습니다 setResult
활동에 의해 연 경우에 따라, 여부 startActivity
나 startActivityForResult
. 을 사용하여이를 달성 할 수 있습니다 getCallingActivity()
. 자세한 내용은 여기를 참조하십시오 .
sharedPreferences 사용 하고 데이터와 응용 프로그램에서 어디서나 액세스 저장
이 같은 날짜를 저장
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);