ฉันมีสองกิจกรรม: กิจกรรมหลักและกิจกรรมเด็ก
เมื่อฉันกดปุ่มในกิจกรรมหลักกิจกรรมย่อยจะเริ่มขึ้น
ตอนนี้ฉันต้องการส่งข้อมูลกลับไปที่หน้าจอหลัก ฉันใช้คลาส Bundle แต่มันไม่ทำงาน มันมีข้อยกเว้นรันไทม์บางอย่าง
มีวิธีแก้ไขปัญหานี้หรือไม่?
ฉันมีสองกิจกรรม: กิจกรรมหลักและกิจกรรมเด็ก
เมื่อฉันกดปุ่มในกิจกรรมหลักกิจกรรมย่อยจะเริ่มขึ้น
ตอนนี้ฉันต้องการส่งข้อมูลกลับไปที่หน้าจอหลัก ฉันใช้คลาส Bundle แต่มันไม่ทำงาน มันมีข้อยกเว้นรันไทม์บางอย่าง
มีวิธีแก้ไขปัญหานี้หรือไม่?
คำตอบ:
มีสองวิธีในการบรรลุสิ่งที่คุณต้องการขึ้นอยู่กับสถานการณ์
สถานการณ์ที่พบบ่อยที่สุด (ซึ่งเป็นสิ่งที่คุณฟังดูเหมือน) คือเมื่อมีการใช้กิจกรรมลูกเพื่อรับอินพุตผู้ใช้เช่นการเลือกผู้ติดต่อจากรายการหรือการป้อนข้อมูลในกล่องโต้ตอบ ในกรณีนี้คุณควรใช้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 จะถูกส่งคืนจากกิจกรรมย่อย
@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;
}
}
}
startActivityForResult
startActivity
ตัวอย่างอาจเป็นstartActivityForResult(myIntent, 2);
ที่ 2 คือรหัสผลลัพธ์ซึ่งสามารถแทนที่MY_CHILD_ACTIVITY
ในคำสั่ง switch ข้างต้น
กิจกรรมที่ 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 - การกลับมาจากกิจกรรมก่อนหน้านี้จะเรียกใช้ActivityResult :
@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);
}
}
UPDATE: ตอบความคิดเห็นของ Seenu69 ในกิจกรรมที่สอง
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 นี่คือรูปภาพ
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();
}
}
คำตอบทั้งหมดเหล่านี้จะอธิบายสถานการณ์ของกิจกรรมที่สองของคุณจะต้องเสร็จสิ้นหลังจากส่งข้อมูล
แต่ในกรณีที่หากคุณไม่ต้องการทำกิจกรรมที่สองให้เสร็จสิ้นและต้องการส่งข้อมูลกลับสู่กิจกรรมก่อนเพื่อที่คุณจะสามารถใช้ 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
}
};
ลงทะเบียนผู้รับใน onCreate () -
LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));
ยกเลิกการลงทะเบียนใน onDestroy ()
อีกวิธีหนึ่งในการบรรลุผลลัพธ์ที่ต้องการซึ่งอาจดีกว่าขึ้นอยู่กับสถานการณ์ของคุณคือการสร้างอินเทอร์เฟซผู้ฟัง
โดยการทำให้กิจกรรมหลักฟังอินเทอร์เฟซที่ได้รับการทริกเกอร์โดยกิจกรรมย่อยในขณะที่ส่งผ่านข้อมูลที่ต้องการเนื่องจากพารามิเตอร์สามารถสร้างชุดสถานการณ์ที่คล้ายกัน
มีวิธีบางอย่างในการทำเช่นนี้ 1. โดยใช้ startActivityForResult () ซึ่งอธิบายได้ดีมากในคำตอบข้างต้น
โดยการสร้างตัวแปรสแตติกในคลาส "Utils" หรือคลาสอื่น ๆ ของคุณเอง ตัวอย่างเช่นฉันต้องการส่ง studentId จาก ActivityB ไปยัง ActivityA.First ของฉัน ActivityA กำลังเรียกใช้ ActivityB จากนั้นภายใน ActivityB ให้ตั้งค่า studentId (ซึ่งเป็นฟิลด์แบบคงที่ใน Utils.class) เช่นนี้ Utils.STUDENT_ID = "1234"; จากนั้นในขณะที่กลับมาที่ ActivityA ให้ใช้ studentId ซึ่งเก็บไว้ใน UtilsSTUDENT_ID
โดยการสร้างวิธี getter และ setter ใน Application Class ของคุณ
แบบนี้:
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;
}
}
ดังนั้นคุณเสร็จแล้ว เพียงตั้งค่าข้อมูลภายในเมื่อคุณอยู่ใน ActivityB และหลังจากกลับมาที่ ActivityA ให้รับข้อมูล
เพียงรายละเอียดเล็ก ๆ ที่ฉันคิดว่าขาดคำตอบข้างต้น
หากกิจกรรมที่บุตรหลานของคุณสามารถเปิดได้จากกิจกรรมที่ผู้ปกครองหลายแล้วคุณสามารถตรวจสอบว่าคุณต้องทำsetResult
หรือไม่ขึ้นอยู่กับว่ากิจกรรมของคุณถูกเปิดออกโดยหรือstartActivity
คุณสามารถบรรลุนี้โดยใช้startActivityForResult
getCallingActivity()
ข้อมูลเพิ่มเติมที่นี่
ใช้SharedPreferencesและบันทึกข้อมูลของคุณและเข้าถึงได้จากทุกที่ในแอปพลิเคชัน
บันทึกวันที่เช่นนี้
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);