จะส่งข้อมูลจากกิจกรรมที่ 2 ไปยังกิจกรรมที่ 1 ได้อย่างไรเมื่อกดกลับ - android


185

ฉันได้ 2 กิจกรรมActivity1และactivity2

ในActivity1ฉันปุ่มและTextView เมื่อคลิกปุ่มกิจกรรมที่ 2จะเริ่มขึ้น

ในActivity2ฉันEditText

ผมต้องการที่จะแสดงข้อมูลที่ดึงมาจากEditTextในactivity2ในTextViewในActivity1เมื่อกลับถูกกดจากactivity2

ใครสามารถช่วยฉันด้วยรหัสเพื่อให้งานนี้ได้อย่างไร


2
อ่านเกี่ยวกับstartActivityForResult
Dmitry Zaytsev


อีกวิธีหนึ่ง: Activity2ใส่ค่าในที่เก็บข้อมูลถาวรและActivity1อ่านจากที่นั่น
Henry

@ kumareloaded: คุณช่วยแบ่งปันโซลูชันที่นี่ได้ไหม Pastebin ไม่ทำงานในประเทศของฉัน ณ ตอนนี้
user1903022

คำตอบ:


327

เริ่มต้น Activity2 ด้วยstartActivityForResultและใช้setResultวิธีการในการส่งข้อมูลกลับจาก Activity2 ไปยัง Activity1 ใน Activity1 คุณจะต้องแทนที่onActivityResultการอัพเดทTextViewด้วยEditTextข้อมูลจาก Activity2

ตัวอย่างเช่น:

ในกิจกรรม 1 เริ่มต้นกิจกรรม 2 เป็น:

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

ในActivity2ใช้setResultสำหรับส่งข้อมูลกลับ:

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

และในActivity1รับข้อมูลด้วย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");
         }     
    }
} 

หากทำได้ให้ใช้SharedPreferencesเพื่อแชร์ข้อมูลระหว่างกิจกรรม


1
คนขอบคุณถ้าคุณสามารถคุณสามารถช่วยฉันด้วยส่วนการเข้ารหัสที่คล้ายกันสำหรับ SharedPreferences จะทำเช่นเดียวกัน :)
kumareloaded

1
@kumareloaded: ยินดีต้อนรับเพื่อนมากที่สุด หากคุณต้องการใช้แบบเดียวกันSharedPreferencesโปรดดูตัวอย่างนี้
Kяσѕρєя K

2
@ kumareloaded: ถ้าคุณให้ลิงค์รหัสของทั้งสองคลาสกับสิ่งที่คุณได้ลองใช้pastebin.com แล้วฉันจะแก้ไขโค้ดของคุณ
Kяσѕρєя K

1
@kumareloaded: ตอนนี้ใช้รหัสนี้และจะใช้งานได้
Kяσѕρєя K

1
@ ρяσѕρєяK: คุณช่วยกรุณาแบ่งปันรหัสสำหรับสถานการณ์ข้างต้นโดยใช้ SharedPref ในคำตอบของคุณ Pastebin ไม่ได้เปิดในหลายประเทศ การแบ่งปันที่นี่จะเป็นประโยชน์อย่างมากขอบคุณ
user1903022

26

Activity1ควรเริ่มต้นactivity2startActivityForResult()กับ

activity2ควรใช้setResult()ในการส่งข้อมูลกลับไปยังActivity1

ในกิจกรรม 2

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

ในกิจกรรม 1

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

@Samam ฉันเดาเพราะคุณไม่ได้พูดถึงกิจกรรม 1 ควรเริ่มต้นกิจกรรม 2 ด้วย startactivityforresult
LutfiTekin

1
@ LutfiTekin: นั่นอาจเป็นไปได้! ขอบคุณที่ชี้นำ! แก้ไขคำตอบของฉัน :)
Swayam

17

คำตอบอื่น ๆ ไม่ได้ทำงานเมื่อฉันใส่ในsetResult onBackPressedการแสดงความคิดเห็นการเรียกไปที่ super onBackPressedและการโทรfinishด้วยตนเองแก้ไขปัญหา:

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

และในกิจกรรมแรก:

@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

ใช้สิ่งนี้เป็นทางเลือกสำหรับ startActivityforResult แต่โปรดทราบว่าสำหรับกรณีดังกล่าววิธีการนี้อาจมีราคาแพงในแง่ของประสิทธิภาพ แต่ในบางกรณีคุณอาจจำเป็นต้องใช้

ในกิจกรรม 2

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

ในกิจกรรม 1

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

สิ่งนี้ไม่สามารถใช้สำหรับวัตถุ (เฉพาะสตริงบูลีนและอื่น ๆ )
FindOut_Quran

1
ในกรณีของฉันฉันเปิดตัวกิจกรรมจากรายการใน MainActivity และต้องการให้ผู้ใช้สร้างข้อมูลกลับไปที่รายการ startActivityForResult () ไม่สามารถใช้ได้กับฉันในกรณีนี้ซึ่งฉันใช้ mContext.startActivity () ตัวอย่าง @katmanco ที่นี่เป็นประโยชน์ในการแก้ไข
ผิดพลาด

สำหรับฉันนั่นคือการเลือกตั้งที่ไม่ดี มีอยู่ actionForResult
marlonpya

2

นี่เป็น Activity1 แรกของคุณ

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");
    }
}
}

จากตรงนี้คุณจะเริ่มต้น Activity2.class ของคุณโดยใช้startActivityForResult (mRequestCode, Activity2.class);

ตอนนี้เป็นกิจกรรมที่สองของคุณชื่อคือ 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);
}

}

ตอนนี้เมื่อคุณทำกับกิจกรรมที่สองของคุณแล้วคุณโทร setResult () วิธีการจาก onBackPress () หรือจากปุ่มใด ๆ คลิกเมื่อ activity2 ของคุณจะทำลายแล้ววิธีโทรกลับ Activity1 ของคุณonActivityResult ()จะเรียกจากที่นั่นคุณจะได้รับข้อมูลของคุณจากความตั้งใจ ..

หวังว่ามันจะช่วยให้คุณ ... :)


2

อ่านสิ่งเหล่านี้:

  1. ส่งคืนผลลัพธ์ไปที่ onActivityResult ()
  2. การดึงผลลัพธ์จากกิจกรรมที่เรียก - การสอน Android สำหรับมือใหม่

บทความเหล่านี้จะช่วยให้คุณเข้าใจวิธีส่งผ่านข้อมูลระหว่างสองกิจกรรมใน Android


2

จาก FirstActivity ของคุณเรียก SecondActivity โดยใช้วิธี startActivityForResult ()

ตัวอย่างเช่น:

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

ใน SecondActivity ของคุณตั้งค่าข้อมูลที่คุณต้องการกลับไปที่ FirstActivity หากคุณไม่ต้องการกลับมาอย่าตั้งค่าใด ๆ

ตัวอย่างเช่น: ใน secondActivity หากคุณต้องการส่งข้อมูลกลับ:

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
        }
    }
}

1

TL; DR ใช้ Activity.startActivityForResult

คำตอบยาว:

คุณควรเริ่มต้นด้วยการอ่านเอกสารสำหรับนักพัฒนา Android หัวข้อคำถามของคุณโดยเฉพาะครอบคลุมอยู่ในStarting Activities and Getting Resultsส่วนของActivityเอกสาร

สำหรับโค้ดตัวอย่าง Android SDK ให้ตัวอย่างที่ดี นอกจากนี้คำตอบอื่น ๆ ที่นี่ให้ตัวอย่างโค้ดสั้น ๆ แก่คุณเพื่อใช้

อย่างไรก็ตามหากคุณกำลังมองหาทางเลือกอื่นให้อ่านคำถาม SOนี้ นี่เป็นการสนทนาที่ดีเกี่ยวกับวิธีใช้startActivityForResultsกับแฟรกเมนต์รวมถึงวิธีการสองอย่างสำหรับการส่งผ่านข้อมูลระหว่างกิจกรรม


0

และฉันมีปัญหาที่ฉันต้องการทำเช่นนี้ส่งข้อมูลชนิดในปุ่มนุ่มที่ฉันได้ทำและ softKey ซึ่งเป็นค่าเริ่มต้นในทุกอุปกรณ์ Android ดังนั้นฉันได้ทำสิ่งนี้ก่อนอื่นฉันได้ทำIntentในของฉัน "A" Activity:

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

จากนั้นในกิจกรรมที่สองของฉันฉันได้ประกาศฟิลด์ใน "B" ของฉันActivity:

private static int resultCode = 40;

จากนั้นหลังจากที่ฉันทำคำขอของฉันสำเร็จหรือเมื่อใดก็ตามที่ฉันต้องการบอกกิจกรรม "A" ว่างานนี้เสร็จเรียบร้อยแล้วให้เปลี่ยนค่าของ resultCode เป็นแบบเดียวกับที่ฉันพูดใน "A" Activityซึ่งในกรณีของฉันคือ "60" และ แล้ว:

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

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

PS: อย่าลืมลบออกSuperจากวิธี onBackPressed ถ้าคุณต้องการให้มันทำงานอย่างถูกต้อง

ฉันควรเรียกonActivityResultวิธีนี้ในกิจกรรม "A" ด้วย:

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

แค่นี้ก็หวังว่ามันจะช่วยคุณได้ #HappyCoding;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.