วิธีการส่งผ่านค่าจากกิจกรรมหนึ่งไปยังกิจกรรมก่อนหน้า


100

ฉันจะส่งค่าจากหน้าจอหนึ่งไปยังหน้าจอก่อนหน้าได้อย่างไร

ลองพิจารณากรณีนี้: ฉันมีสองกิจกรรม หน้าจอแรกมีหนึ่งTextViewปุ่มและกิจกรรมที่สองมีหนึ่งEditTextปุ่ม

ถ้าฉันคลิกปุ่มแรกมันจะต้องย้ายไปที่กิจกรรมที่สองและที่นี่ผู้ใช้ต้องพิมพ์อะไรบางอย่างในกล่องข้อความ TextViewถ้าเขากดปุ่มจากหน้าจอที่สองแล้วค่าจากกล่องข้อความควรย้ายไปที่กิจกรรมแรกและที่ควรจะถูกแสดงในกิจกรรมแรก



คำตอบ:


244

ในการบันทึกการดำเนินการกับกิจกรรมหนึ่งภายในอีกกิจกรรมหนึ่งต้องใช้สามขั้นตอน

เปิดกิจกรรมรอง (กิจกรรม 'แก้ไขข้อความ' ของคุณ) เป็นกิจกรรมย่อยโดยใช้startActivityForResultจากกิจกรรมหลักของคุณ

Intent i = new Intent(this,TextEntryActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

ภายในกิจกรรมย่อยแทนที่จะปิดกิจกรรมเมื่อผู้ใช้คลิกปุ่มคุณจะต้องสร้าง Intent ใหม่และรวมค่าข้อความที่ป้อนไว้ในบันเดิลพิเศษ เพื่อส่งกลับไปยังการโทรของผู้ปกครองsetResultก่อนที่จะโทรfinishเพื่อปิดกิจกรรมรอง

Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

ขั้นตอนสุดท้ายอยู่ในกิจกรรมการโทร: แทนที่onActivityResultเพื่อฟังการโทรกลับจากกิจกรรมการป้อนข้อความ รับความพิเศษจาก Intent ที่ส่งคืนเพื่อรับค่าข้อความที่คุณควรแสดง

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
    case (STATIC_INTEGER_VALUE) : { 
      if (resultCode == Activity.RESULT_OK) { 
      String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
      // TODO Update your TextView.
      } 
      break; 
    } 
  } 
} 

27
ทั้งหมดนี้ทำงานให้ฉันยกเว้นnew Intent(null);คือ "คลุมเครือเกินไป" new Intent();และฉันก็จะเปลี่ยนเป็น
Richard Tingle

1
นอกจากนี้ยังเป็นที่น่าสังเกตว่าสิ่งนี้จะใช้ได้เฉพาะในบริบทเดียวกันเท่านั้น ถ้าคุณเริ่มกิจกรรมจากส่วนย่อยเช่นจะไม่ทำงานเนื่องจาก requestCode จะแตกต่างกันในแต่ละครั้ง คุณจะต้องใช้ getActivity (). startActivityForResult () ในแฟรกเมนต์
stef

Reto - คุณช่วยพิจารณาคำถามล่าสุดของฉันเกี่ยวกับสถานการณ์ที่คล้ายคลึงกันได้ไหม
Bryan Potts

10

มีสองวิธีที่คุณสามารถเข้าถึงตัวแปรหรือวัตถุในคลาสหรือกิจกรรมอื่น ๆ

ก. ฐานข้อมูล

B. การตั้งค่าร่วมกัน

ค. การจัดลำดับวัตถุ

D. คลาสที่สามารถเก็บข้อมูลทั่วไปสามารถตั้งชื่อเป็น Common Utilities ได้ขึ้นอยู่กับคุณ

E. การส่งข้อมูลผ่าน Intents และ Parcelable Interface

ขึ้นอยู่กับความต้องการโครงการของคุณ

ก. ฐานข้อมูล

SQLite เป็นฐานข้อมูลโอเพ่นซอร์สซึ่งฝังอยู่ใน Android SQLite รองรับคุณสมบัติฐานข้อมูลเชิงสัมพันธ์มาตรฐานเช่นไวยากรณ์ SQL ธุรกรรมและคำสั่งที่เตรียมไว้

บทช่วยสอน - http://www.vogella.com/articles/AndroidSQLite/article.html

ข. ตั้งค่าที่ใช้ร่วมกัน

สมมติว่าคุณต้องการจัดเก็บชื่อผู้ใช้ ดังนั้นตอนนี้จะมีสองสิ่งคือชื่อผู้ใช้หลักมูลค่ามูลค่า

วิธีการจัดเก็บ

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

การใช้ putString (), putBoolean (), putInt (), putFloat (), putLong () คุณสามารถบันทึกประเภท dtatype ที่คุณต้องการได้

วิธีดึงข้อมูล

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

ค. Object Serialization

Object serlization ถูกใช้หากเราต้องการบันทึกสถานะวัตถุเพื่อส่งผ่านเครือข่ายหรือคุณสามารถใช้เพื่อวัตถุประสงค์ของคุณได้เช่นกัน

ใช้ถั่วจาวาและเก็บไว้เป็นหนึ่งในช่องของเขาและใช้ getters และ setter สำหรับสิ่งนั้น

JavaBeans เป็นคลาส Java ที่มีคุณสมบัติ คิดว่าคุณสมบัติเป็นตัวแปรอินสแตนซ์ส่วนตัว เนื่องจากเป็นแบบส่วนตัววิธีเดียวที่สามารถเข้าถึงได้จากภายนอกชั้นเรียนคือใช้วิธีการในชั้นเรียน เมธอดที่เปลี่ยนค่าคุณสมบัติเรียกว่าเมธอด setter และเมธอดที่ดึงค่าคุณสมบัติเรียกว่าเมธอด getter

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

ตั้งค่าตัวแปรในเมธอดเมลของคุณโดยใช้

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

จากนั้นใช้อ็อบเจ็กต์ Serialzation เพื่อทำให้เป็นซีเรียลไลซ์อ็อบเจ็กต์นี้และในคลาสอื่นของคุณ deserialize อ็อบเจ็กต์นี้

ในการทำให้เป็นอนุกรมอ็อบเจ็กต์สามารถแสดงเป็นลำดับของไบต์ซึ่งรวมถึงข้อมูลของอ็อบเจ็กต์เช่นเดียวกับข้อมูลเกี่ยวกับประเภทของอ็อบเจ็กต์และประเภทของข้อมูลที่จัดเก็บในอ็อบเจ็กต์

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

หากคุณต้องการบทช่วยสอนนี้โปรดดูที่ลิงค์นี้

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

รับตัวแปรในคลาสอื่น ๆ

ง. CommonUtilities

คุณสามารถสร้างชั้นเรียนด้วยตนเองซึ่งสามารถมีข้อมูลทั่วไปที่คุณต้องการบ่อยในโครงการของคุณ

ตัวอย่าง

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

จ. ส่งข้อมูลผ่านเจตนา

โปรดดูบทช่วยสอนนี้สำหรับตัวเลือกในการส่งผ่านข้อมูลนี้

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/


6

คุณไม่ต้อง ...

เพียงเรียกใช้ newIntent () จากกิจกรรมที่สอง

Intent retData=new Intent();

เพิ่มข้อมูลที่จะส่งกลับ

putExtras (retData.putExtra("userName", getUsrName()));

ไปข้างหน้าด้วย setResult

setResult(RESULT_OK, retData);

แล้วก็สามารถจบ

finish();


2

ฉันมักจะใช้ตัวแปรแบบคงที่ในกิจกรรมการเรียกด้วยวิธีการตั้งค่าคงที่เพื่อตั้งค่า

ด้วยวิธีนี้ฉันสามารถเปลี่ยนค่าในกิจกรรมใด ๆ ได้ตามต้องการโดยไม่คำนึงถึงขั้นตอนการควบคุมที่แน่นอนระหว่างกิจกรรมต่างๆ

โปรดทราบว่าเคล็ดลับนี้สามารถใช้ได้ก็ต่อเมื่อคุณไม่สนใจเกี่ยวกับการสร้างอินสแตนซ์ของกิจกรรมเดียวกัน (คลาส) มากกว่าหนึ่งสำเนาในแอปพลิเคชัน แต่ฉันพบว่านี่เป็นวิธีที่ง่ายที่สุดในการนำไปใช้และฉันใช้มันมากที่สุด .


ไม่ใช่ทางออกที่ดี สิ่งนี้ขัดต่อแนวทางปฏิบัติที่ดีที่สุดของ Android คุณไม่สามารถรับประกันได้ว่ากิจกรรมจะไม่ถูกฆ่าและอินสแตนซ์ใหม่เริ่มต้นโดยระบบ
SIr Codealot

0

วิธีที่ดีที่สุดในการทำที่นี่คือการใส่ตัวแปรลงในคลาสทั่วไปซึ่งกำหนดไว้นอกขอบเขต

public class Utils 
{
    public static String mPosition;
}

ภายในรหัสของคุณ (เช่น OnButtonClick ฯลฯ ... )

Intent intent = new Intent(Intent.ACTION_PICK, 
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);

ภายในรหัสของ

@Override โมฆะสาธารณะ onActivityResult (int requestCode, int resultCode, ข้อมูล Intent) {if (requestCode == Keys.PICK_CONTACT) {if (resultCode == Activity.RESULT_OK) {Uri contactData = data.getData ();

            //you may use the variable here after intent result
            LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.