Android에서 기본 활동으로 데이터 전송 누르면 하위 활동이 시작됩니다. 이제 일부

주요 활동과 아동 활동이라는 두 가지 활동이 있습니다.
주 활동에서 버튼을 누르면 하위 활동이 시작됩니다.

이제 일부 데이터를 기본 화면으로 다시 보내려고합니다. 번들 클래스를 사용했지만 작동하지 않습니다. 런타임 예외가 발생합니다.

이에 대한 해결책이 있습니까?



답변

상황에 따라 원하는 것을 달성하는 몇 가지 방법이 있습니다.

가장 일반적인 시나리오 (사운드처럼 들리는 방법)는 목록에서 연락처를 선택하거나 대화 상자에 데이터를 입력하는 등의 하위 활동을 사용하여 사용자 입력을 얻는 경우입니다. 이 경우 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;
    }
  }
}

답변

활동 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();
    }
}