programing

Android에서 기본 활동으로 데이터 다시 보내기

closeapi 2023. 8. 14. 22:53
반응형

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 레이아웃 파일을 제공하는 대신 이미지가 있습니다.

enter image description here

기본 활동

  • 로 두 번째 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()를 사용합니다.

  1. "Utils" 클래스 또는 자신의 다른 클래스에서 정적 변수를 생성합니다.예를 들어 활동 B에서 활동 A로 studentId를 전달하고자 합니다.먼저 저의 활동 A는 활동 B를 부르는 것입니다.그런 다음 활동 B 내부에서 studentId(Utils.class의 정적 필드)를 설정합니다.이런 Utils.STUDEN_ID="1234". 활동 A로 돌아가는 동안 Utils에 저장된 studentId를 사용합니다.학생_ID.

  2. 응용 프로그램 클래스에서 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

반응형