Làm cách nào để truyền dữ liệu từ hoạt động thứ 2 sang hoạt động thứ 1 khi được nhấn lại? - Android


183

Tôi có 2 hoạt động, Activity1Activity2 .

Trong Activity1Tôi có một NútTextView . Khi nhấp vào nút Activity2 được bắt đầu.

Trong Activity2Tôi có một Chỉnh sửa .

Tôi muốn hiển thị dữ liệu được truy xuất từ EditText trong Activity2 trong TextView trong Activity1 khi nhấn trở lại từ Activity2 .

ai đó có thể giúp tôi với mã để làm cho công việc này?


2
đọc vềstartActivityForResult
Dmitry Zaytsev


Một cách khác: Activity2đặt giá trị trong bộ lưu trữ liên tục và Activity1đọc nó từ đó.
Henry

@kumareloaded: Bạn có thể vui lòng chia sẻ giải pháp tại đây. Pastebin không hoạt động ở nước tôi bây giờ.
dùng1903022

Câu trả lời:


325

Bắt đầu Activity2 với startActivityForResultvà sử dụng setResultphương thức để gửi dữ liệu trở lại từ Activity2 đến Activity1. Trong Activity1, bạn sẽ cần ghi đè onActivityResultđể cập nhật TextViewvới EditTextdữ liệu từ Activity2.

Ví dụ:

Trong Activity1 , bắt đầu Activity2 là:

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, 1);

Trong Activity2 , sử dụng setResultđể gửi dữ liệu trở lại:

Intent intent = new Intent();
intent.putExtra("editTextValue", "value_here")
setResult(RESULT_OK, intent);        
finish();

Và trong Activity1 , nhận dữ liệu với onActivityResult:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             String strEditText = data.getStringExtra("editTextValue");
         }     
    }
} 

Nếu bạn có thể, hãy sử dụng SharedPreferences để chia sẻ dữ liệu giữa các Hoạt động.


1
cảm ơn bạn, nếu bạn có thể giúp tôi với phần mã hóa tương tự để SharedPreferences thực hiện tương tự :)
kumareloaded

1
@kumareloaded: chào mừng bạn. nếu bạn muốn làm như vậy bằng cách sử dụng SharedPreferencesthì hãy xem ví dụ này
ρяσѕρєя K

2
@kumareloaded: nếu bạn cung cấp cho tôi các liên kết mã của cả hai lớp với những gì bạn đã thử sử dụng pastebin.com thì tôi sẽ chỉnh sửa mã của bạn
ρяσѕρєя K

1
@kumareloaded: bây giờ sử dụng mã này và nó sẽ hoạt động
ρяρя K

1
@ яσѕρєяK: Bạn có thể vui lòng chia sẻ mã cho kịch bản trên bằng cách sử dụng SharedPref trong câu trả lời của bạn. Pastebin không mở ra ở nhiều quốc gia. Chia sẻ nó ở đây sẽ giúp ích rất nhiều, cảm ơn bạn.
dùng1903022

25

Activity1 nên bắt đầu Activity2 với startActivityForResult().

Activity2 nên sử dụng setResult()để gửi dữ liệu trở lại Activity1 .

Trong hoạt động 2 ,

@Override
public void onBackPressed() {
    String data = mEditText.getText();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(resultcode, intent);
}

Trong Hoạt động1 ,

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}

@Swayam Tôi đoán vì bạn không đề cập đến hoạt động1 nên bắt đầu hoạt động2 với startactivityforresult.
LutfiTekin

1
@LutfiTekin: Điều đó rất có thể là nó! Cảm ơn đã chỉ ra điều đó! Chỉnh sửa câu trả lời của tôi. :)
Swayam

17

Các câu trả lời khác không hoạt động khi tôi đưa setResultvào onBackPressed. Nhận xét cuộc gọi đến siêu onBackPressedvà gọi finishthủ công giải quyết vấn đề:

@Override
public void onBackPressed() {
    //super.onBackPressed();
    Intent i = new Intent();
    i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
    setResult(RESULT_OK, i);
    finish();
}

Và trong hoạt động đầu tiên:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == QUEUE_MSG) {
        if (resultCode == RESULT_OK) {
            Serializable tmp = data.getSerializableExtra(MainActivity.EXTRA_NON_DOWNLOADED_PAGES);
            if (tmp != null)
                serializable = tmp;
        }
    }
}

6

Hãy coi đây là một thay thế cho startActivityforResult. Nhưng hãy nhớ rằng đối với những trường hợp như vậy, phương pháp này có thể tốn kém về mặt hiệu suất nhưng trong một số trường hợp bạn có thể cần phải sử dụng.

Trong hoạt động 2,

@Override
public void onBackPressed() {
String data = mEditText.getText();
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
Editor editor = sp.edit();
editor.putString("email",data);
editor.commit();
}

Trong Hoạt động1,

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 

Điều này không thể được sử dụng cho đối tượng (chỉ chuỗi, boolean, v.v.)
FindOut_Quran

1
Trong trường hợp của tôi, tôi đã khởi chạy một hoạt động từ một mục danh sách trong MainActivity và muốn đưa người dùng tạo dữ liệu trở lại mục danh sách đó. startActivityForResult () không có sẵn cho tôi trong trường hợp này khi tôi đang sử dụng mContext.startActivity (). @katmanco ví dụ ở đây là một công việc hữu ích xung quanh.
Bị lỗi

Đối với tôi đó là một cuộc bầu cử tồi tệ. tồn tại hành độngForResult
marlonpya

2

đây là Activity1 đầu tiên của bạn.

public class Activity1 extends Activity{
private int mRequestCode = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, Activity2.class);
    startActivityForResult(intent, mRequestCode);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == mRequestCode && resultCode == RESULT_OK){
        String editTextString = data.getStringExtra("editText");
    }
}
}

Từ đây, bạn sẽ bắt đầu Activity2. Class của mình bằng cách sử dụng startActivityForResult (mRequestCode, Activity2. Class);

Bây giờ đây là Hoạt động thứ hai của bạn, tên là Activity2

public class Activity2 extends Activity {
private EditText mEditText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //mEditText = (EditText)findViewById(R.id.edit_text);

    Intent intent = new Intent();
    intent.putExtra("editText", mEditText.getText().toString());
    setResult(RESULT_OK, intent);
}

}

Bây giờ khi bạn thực hiện với Hoạt động thứ hai của mình thì bạn gọi phương thức setResult (), từ onBackPress () hoặc từ bất kỳ nút bấm nào khi Activity2 của bạn sẽ hủy sau đó phương thức gọi lại của Activity1 trênActivityResult () sẽ gọi từ đó bạn có thể lấy dữ liệu từ đó ..

Hy vọng nó sẽ giúp ích cho bạn ... :)



2

Từ FirstActivity của bạn, hãy gọi SecondActivity bằng phương thức startActivityForResult ().

Ví dụ:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

Trong SecondActivity của bạn, đặt dữ liệu mà bạn muốn quay lại FirstActivity. Nếu bạn không muốn quay lại, đừng đặt bất kỳ.

Ví dụ: Trong secondActivity nếu bạn muốn gửi lại dữ liệu:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

Nếu bạn không muốn trả lại dữ liệu:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Bây giờ trong lớp FirstActivity của bạn viết mã sau cho phương thức 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
        }
    }
}

1

Sử dụng TL; Activity.startActivityForResult

Câu trả lời dài:

Bạn nên bắt đầu bằng cách đọc tài liệu dành cho nhà phát triển Android. Cụ thể chủ đề của câu hỏi của bạn được đề cập trong Starting Activities and Getting Resultsphần Activitytài liệu.

Ví dụ mã, SDK Android cung cấp các ví dụ tốt. Ngoài ra, các câu trả lời khác ở đây cung cấp cho bạn các đoạn mã mẫu ngắn để sử dụng.

Tuy nhiên, nếu bạn đang tìm kiếm giải pháp thay thế, hãy đọc câu hỏi SO này . Đây là một cuộc thảo luận tốt về cách sử dụng startActivityForResultsvới các đoạn, cũng như các phương pháp tiếp cận để truyền dữ liệu giữa các hoạt động.


0

và tôi có một vấn đề mà tôi muốn làm kiểu dữ liệu gửi này trong một nút mềm mà tôi đã thực hiện và softkey đó là mặc định trong mỗi thiết bị Android, vì vậy tôi đã làm điều này, đầu tiên tôi đã thực hiện một Intenttrong tôi "A" Activity:

            Intent intent = new Intent();
            intent.setClass(context, _AddNewEmployee.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, 6969);
            setResult(60);

Sau đó, trong Hoạt động thứ hai của mình, tôi đã khai báo Trường trong "B" của mình Activity:

private static int resultCode = 40;

sau đó sau khi tôi thực hiện yêu cầu thành công hoặc bất cứ khi nào tôi muốn nói với Hoạt động "A" rằng công việc này được thực hiện thành công ở đây, thay đổi giá trị của resultCode thành giống như tôi đã nói trong "A" Activitymà trong trường hợp của tôi là "60" và sau đó:

private void backToSearchActivityAndRequest() {
    Intent data = new Intent();
    data.putExtra("PhoneNumber", employeePhoneNumber);
    setResult(resultCode, data);
    finish();
}

@Override
public void onBackPressed() {
    backToSearchActivityAndRequest();
}

PS: Hãy nhớ xóa Superphương thức onBackPression nếu bạn muốn nó hoạt động bình thường.

sau đó tôi cũng nên gọi onActivityResultPhương thức trong Hoạt động "A" của mình:

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 6969 && resultCode == 60) {
            if (data != null) {
                    user_mobile = data.getStringExtra("PhoneNumber");
                    numberTextField.setText(user_mobile);
                    getEmployeeByNumber();
            }
        }
    }

đó là nó, hy vọng nó sẽ giúp bạn ra ngoài. #HappyCoding;

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.