ปุ่มย้อนกลับและรีเฟรชกิจกรรมก่อนหน้า


85

หากเรามีสองกิจกรรม:

  1. รายการไฟล์และเวลาที่แก้ไขล่าสุด
  2. กิจกรรมการแก้ไขไฟล์

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

รายการจะไม่ถูกโหลดซ้ำดังนั้นจึงแสดงค่าที่ไม่ถูกต้องสำหรับเวลาที่แก้ไขไฟล์ที่แก้ไข

อะไรคือวิธีการที่เหมาะสมในการทำให้รายการไฟล์รีเฟรชหลังจากกดปุ่มย้อนกลับ

ตัวอย่างนี้ถือว่าไม่มีการใช้ฐานข้อมูลเพียงแค่ ArrayAdapter


1
onRestart () ควรทำงานได้ดีขึ้น onResume () จะถูกเรียกสองครั้งและ onRestart () จะถูกเรียกก็ต่อเมื่อคุณกดปุ่มย้อนกลับ
Sarah Sakamoto

คำตอบ:


108

ทางเลือกหนึ่งคือใช้ onResume ของกิจกรรมแรกของคุณ

@Override
public void onResume()
    {  // After a pause OR at startup
    super.onResume();
    //Refresh your stuff here
     }

หรือคุณสามารถเริ่มกิจกรรมเพื่อผลลัพธ์:

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

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

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

หากคุณไม่ต้องการส่งคืนข้อมูล:

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

ตอนนี้ในคลาส FirstActivity ของคุณเขียนโค้ดต่อไปนี้สำหรับonActivityResult()วิธีการ

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  if (requestCode == 1) {

     if(resultCode == RESULT_OK){      
         //Update List         
     }
     if (resultCode == RESULT_CANCELED) {    
         //Do nothing?
     }
  }
}//onActivityResult

จะเกิดอะไรขึ้นถ้าฉันไม่ต้องการทำกิจกรรมปัจจุบันให้เสร็จและต้องการให้อัปเดตกิจกรรมก่อนหน้า
มันซู ....

@Waza_ onResumeอย่าเรียกฉันว่าฉันคิดว่าทำไม? ( ผมพยายามonRestartและonPauseเกินไป แต่ไม่มีของพวกเขาไม่ได้เรียกว่า )
เมห์ Dehghani

ในกรณีของฉันฉันไปที่กิจกรรมจาก Fragment ดังนั้นเมื่อกลับมาจาก Activity เป็น Fragment เนื่องจากคำตอบอื่น ๆ กำลังพูดถึง onRestart () ซึ่งไม่มีอยู่ใน Fragment ดังนั้นคำตอบนี้จึงเหมาะกับฉัน สำหรับ Fragment คุณสามารถใช้ onResume ()
Feroz Khan

40

ฉันคิดว่า onRestart () ทำงานได้ดีกว่าสำหรับสิ่งนี้

@Override
public void onRestart() { 
    super.onRestart();
    //When BACK BUTTON is pressed, the activity on the stack is restarted
    //Do what you want on the refresh procedure here
}

คุณสามารถเขียนโค้ดสิ่งที่คุณต้องการทำเมื่อเริ่มกิจกรรมใหม่ (เรียกอีกครั้งจากเหตุการณ์ 'กดปุ่มย้อนกลับ') ภายใน onRestart ()

ตัวอย่างเช่นหากคุณต้องการทำสิ่งเดียวกับที่คุณทำใน onCreate () ให้วางโค้ดใน onRestart () (เช่นการสร้าง UI ใหม่ด้วยค่าที่อัปเดต)


7
นี่เป็นเรื่องเล็กน้อย แต่ฉันต้องบอกว่ามันจะดีกว่าถ้าจะย้ายโค้ด onCreate () ของคุณไปเป็นวิธีการแยกต่างหากจากนั้นคุณจะเรียกใช้จากทั้ง onCreate () และ onRestart () แทนที่จะคัดลอกวาง
Ricardo van den Broek

คุณยังสามารถใช้ onCreate () เพื่อขยายมุมมองและสร้างอินสแตนซ์ตัวแปรส่วนกลางและใช้ onStart () เพื่อกำหนด / (re) ตั้งค่าได้ ดังนั้น init () ของคุณ (หรืออะไรก็ตามที่คุณต้องการเรียกมัน) จะถูกเรียกทุกครั้งที่กิจกรรมเริ่มต้น เช่นหลังจาก onCreate () หรือหลังจาก onRestart ()
jwehrle

สิ่งนี้มีประโยชน์มากหากคุณต้องการให้ ViewModel ของกิจกรรมของคุณเริ่มต้นใหม่ ให้มันดึงข้อมูลจากฐานข้อมูลอีกครั้งตั้งค่าตัวแปรอินสแตนซ์ ...
มหาศาล

34

หลัก:

@Override
public void onRestart()
{
    super.onRestart();
    finish();
    startActivity(getIntent());
}

ฉันคาดเดาว่าสิ่งนี้จะเข้าสู่กิจกรรมปัจจุบันไม่ใช่กิจกรรมก่อนหน้า?
Si8

1
ฉันมีปัญหาเดียวกันยกเว้นของฉันเป็นส่วนที่ไม่ใช่กิจกรรม ดังนั้นฉันทำตามคำแนะนำที่นี่และได้ผล: stackoverflow.com/questions/35039512/…
David C.

8

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

อ่านสิ่งนี้หากคุณประสบปัญหาในการรีเฟรชรายการ: การรีเฟรชมุมมองรายการ Android


2

หากคุณต้องการรีเฟรชกิจกรรมก่อนหน้าวิธีนี้ควรใช้งานได้:

ในกิจกรรมก่อนหน้านี้ที่คุณต้องการรีเฟรช:

@Override
public void onRestart()
{
    super.onRestart();
    // do some stuff here
}

1
private Cursor getAllFavorites() {
    return mDb.query(DocsDsctnContract.DocsDsctnEntry.Description_Table_Name,
            null,
            null,
            null,
            null,
            null,
            DocsDsctnContract.DocsDsctnEntry.COLUMN_Timest);
}
@Override
public void onResume()
{  // After a pause OR at startup
    super.onResume();
    mAdapter.swapCursor(getAllFavorites());
    mAdapter.notifyDataSetChanged();

}

public void swapCursor(Cursor newCursor){
    if (mCursor!=null) mCursor.close();
    mCursor = newCursor;
    if (newCursor != null){
        mAdapter.notifyDataSetChanged();
    }
}

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


พิจารณาเพิ่มคำอธิบาย
Gahan

1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

ในกิจกรรมก่อนหน้านี้ให้ใช้รหัสนี้ การดำเนินการนี้จะดำเนินการอย่างราบรื่นและโหลดกิจกรรมซ้ำเมื่อคุณกลับมาโดยกดปุ่มย้อนกลับ


คุณสามารถเพิ่มคำอธิบายลงในโค้ดและขอบคุณสำหรับโพสต์
Nelles

0

หากไม่จัดการการโทรกลับจากกิจกรรมการแก้ไข (ด้วย onActivityResult) ฉันควรจะใส่ตรรกะที่คุณกล่าวถึงใน onStart (หรืออาจเป็นใน onRestart) เนื่องจากการมีใน onResume ดูเหมือนจะเกินความจำเป็นเนื่องจากการเปลี่ยนแปลงจะเกิดขึ้นหลังจาก onStop

ในอัตราใดจะคุ้นเคยกับวงจรชีวิตของกิจกรรม นอกจากนี้โปรดสังเกตวิธีการ onRestoreInstanceState และ onSaveInstanceState ซึ่งไม่ปรากฏในแผนภาพวงจรชีวิตที่สวยงาม

(นอกจากนี้ควรตรวจสอบว่าNotepad Tutorialจัดการกับสิ่งที่คุณกำลังทำอยู่แม้ว่าจะใช้ฐานข้อมูลก็ตาม)



0

ลองสิ่งนี้

 public void refreshActivity() {
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

หรือใน Fragment

  public void refreshActivity() {
    Intent i = new Intent(getActivity(), MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

และเพิ่มวิธีนี้ใน onBackPressed () ของคุณเช่น

  @Override
public void onBackPressed() {      
        refreshActivity();
        super.onBackPressed();
    }
}

แค่นั้นแหละ...


0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}

คำถามนี้มีอายุหลายปีและคำตอบที่ให้ไว้ถูกตั้งค่าสถานะให้ตรวจสอบว่าเป็นโพสต์คุณภาพต่ำ คำแนะนำบางประการสำหรับฉันจะเขียนคำตอบที่ดีได้อย่างไร . มีคำตอบอื่น ๆ ที่ให้คำถามของ OP และมีการโพสต์เมื่อไม่นานมานี้ เมื่อโพสต์คำตอบโปรดตรวจสอบให้แน่ใจว่าคุณได้เพิ่มโซลูชันใหม่หรือคำอธิบายที่ดีขึ้นมากโดยเฉพาะอย่างยิ่งเมื่อตอบคำถามเก่า ๆ
help-info.de
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.