Android에서 startActivityForResult를 관리하는 방법은 무엇입니까?
내 활동에서 메인 활동의 두 번째 활동을 startActivityForResult
. 두 번째 활동에는이 활동을 완료하는 몇 가지 메서드가 있지만 (결과가 없을 수도 있음) 그중 하나만 결과를 반환합니다.
예를 들어, 주요 활동에서 두 번째 활동을 호출합니다. 이 활동에서는 카메라가있는 등 핸드셋의 일부 기능을 확인합니다. 없는 경우이 활동을 종료하겠습니다. 또한 준비 중에 MediaRecorder
또는 MediaPlayer
문제가 발생하면이 활동을 종료하겠습니다.
장치에 카메라가 있고 녹화가 완료되면 동영상 녹화 후 사용자가 완료 버튼을 클릭하면 결과 (녹화 된 동영상의 주소)를 기본 활동으로 다시 보냅니다.
주요 활동의 결과를 어떻게 확인합니까?
당신의에서 FirstActivity
호출 SecondActivity
사용 startActivityForResult()
방법
예를 들면 :
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
당신의에서 SecondActivity
설정 데이터는 당신이 다시 돌아가려면 FirstActivity
. 돌아 가지 않으려면 아무것도 설정하지 마십시오.
예 : SecondActivity
데이터를 다시 보내려면 In :
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
}
}
}//onActivityResult
주요 활동의 결과를 확인하는 방법은 무엇입니까?
재정의 Activity.onActivityResult()
한 다음 해당 매개 변수를 확인 해야합니다 .
requestCode
이러한 결과를 반환 한 앱을 식별합니다. 이것은 전화 할 때 사용자가 정의합니다startActivityForResult()
.resultCode
이 앱이 성공했는지, 실패했는지 또는 다른 것을 알려줍니다.data
이 앱에서 반환 한 모든 정보를 보유합니다. 이것은 일 수 있습니다null
.
@Nishant의 답변을 보완하면 활동 결과를 반환하는 가장 좋은 방법은 다음과 같습니다.
Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();
나는 문제가 있었다
new Intent();
그런 다음 올바른 방법이
getIntent();
현재 의도를 얻기 위해
예
전체 프로세스를 맥락에서 보려면 여기에 보충 답변이 있습니다. 자세한 설명 은 내 자세한 답변 을 참조하십시오 .
MainActivity.java
public class MainActivity extends AppCompatActivity {
// Add a different request code for every activity you are starting from here
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) { // Activity.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.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();
}
}
onActivityResult에서 잘못된 requestCode에 문제가있는 사람들을 위해
startActivityForResult()
에서 호출하는 경우 Fragment
Fragment를 소유 한 활동에 의해 requestCode가 변경됩니다.
활동에서 올바른 resultCode를 얻으려면 다음을 시도하십시오.
변화:
startActivityForResult(intent, 1);
에:
getActivity().startActivityForResult(intent, 1);
활동 결과로 사용자 인터페이스를 업데이트하려면 사용할 수 없습니다. this.runOnUiThread(new Runnable() {}
이렇게하면 UI가 새 값으로 새로 고쳐지지 않습니다. 대신 다음을 수행 할 수 있습니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_CANCELED) {
return;
}
global_lat = data.getDoubleExtra("LATITUDE", 0);
global_lng = data.getDoubleExtra("LONGITUDE", 0);
new_latlng = true;
}
@Override
protected void onResume() {
super.onResume();
if(new_latlng)
{
PhysicalTagProperties.this.setLocation(global_lat, global_lng);
new_latlng=false;
}
}
This seems silly but works pretty well.
First you use startActivityForResult()
with parameters in first Activity
and if you want to send data from second Activity
to first Activity
then pass value using Intent
with setResult()
method and get that data inside onActivityResult()
method in first Activity
.
Very common problem in android
It can be broken down into 3 Pieces
1 ) start Activity B (Happens in Activity A)
2 ) Set requested data (Happens in activity B)
3 ) Receive requested data (Happens in activity A)
1) startActivity B
Intent i = new Intent(A.this, B.class);
startActivity(i);
2) Set requested data
이 부분에서는 특정 이벤트가 발생할 때 데이터를 다시 보낼 것인지 여부를 결정합니다.
예 : 활동 B에는 EditText와 두 개의 버튼 b1, b2가 있습니다.
버튼 b1을 클릭하면 데이터가 활동 A로 다시 전송
됩니다. 버튼 b2를 클릭해도 데이터가 전송되지 않습니다.
데이터 보내기
b1......clickListener
{
Intent resultIntent = new Intent();
resultIntent.putExtra("Your_key","Your_value");
setResult(RES_CODE_A,resultIntent);
finish();
}
데이터를 보내지 않음
b2......clickListener
{
setResult(RES_CODE_B,new Intent());
finish();
}
사용자가 뒤로 버튼
을 클릭 함 기본적으로 결과는 Activity.RESULT_CANCEL 응답 코드로 설정됩니다.
3) 결과 검색
해당 재정의 onActivityResult 메서드
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RES_CODE_A) {
// b1 was clicked
String x = data.getStringExtra("RES_CODE_A");
}
else if(resultCode == RES_CODE_B){
// b2 was clicked
}
else{
// back button clicked
}
}
You need to override Activity.onActivityResult()
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_CODE_ONE) {
String a = data.getStringExtra("RESULT_CODE_ONE");
}
else if(resultCode == RESULT_CODE_TWO){
// b was clicked
}
else{
}
}
참고 URL : https://stackoverflow.com/questions/10407159/how-to-manage-startactivityforresult-on-android
'developer tip' 카테고리의 다른 글
배열의 모든 멤버를 동일한 값으로 초기화하는 방법은 무엇입니까? (0) | 2020.09.28 |
---|---|
stdout이 아닌 stderr을 파이프하는 방법은 무엇입니까? (0) | 2020.09.28 |
Trello는 사용자의 클립 보드에 어떻게 액세스하나요? (0) | 2020.09.28 |
easy_install보다 pip를 사용하는 이유는 무엇입니까? (0) | 2020.09.28 |
글로벌 Git 구성을 어떻게 표시합니까? (0) | 2020.09.28 |