Nút quay lại và làm mới hoạt động trước đó


84

Nếu chúng ta có hai hoạt động:

  1. Danh sách các tệp và thời gian sửa đổi lần cuối
  2. Hoạt động chỉnh sửa tệp

Người dùng chọn một tệp từ danh sách và được đưa đến hoạt động chỉnh sửa tệp. Khi chỉnh sửa xong, người dùng nhấn nút quay lại để quay lại danh sách tệp.

Danh sách không được tải lại và do đó một giá trị không chính xác được hiển thị cho thời gian sửa đổi tệp vừa được chỉnh sửa.

Phương pháp thích hợp để làm mới danh sách tệp sau khi nhấn nút quay lại là gì?

Ví dụ này giả định rằng không có cơ sở dữ liệu nào đang được sử dụng, chỉ là ArrayAdapter.


1
onRestart () sẽ hoạt động tốt hơn. onResume () sẽ được gọi hai lần và onRestart () sẽ chỉ được gọi khi bạn nhấn nút quay lại.
Sarah Sakamoto

Câu trả lời:


108

Một tùy chọn sẽ là sử dụng onResume của hoạt động đầu tiên của bạn.

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

Hoặc bạn có thể bắt đầu Hoạt động cho Kết quả:

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

Trong SecondActivity nếu bạn muốn gửi lại dữ liệu:

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

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

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

Bây giờ trong lớp FirstActivity của bạn, hãy viết mã sau cho onActivityResult()phương thức

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

Điều gì sẽ xảy ra nếu tôi không muốn hoàn thành hoạt động hiện tại và muốn hoạt động trước đó được cập nhật
Mansuu ....

@Waza_Bchúng tôi onResumekhông gọi cho tôi, có biết tại sao không? ( Tôi đã cố gắng onRestartonPausecũng vậy, nhưng không ai trong số họ không được gọi )
Mehdi Dehghani

Trong trường hợp của tôi, tôi đã đi đến Hoạt động từ Fragment. Vì vậy, khi quay trở lại từ Hoạt động thành phân mảnh, vì các câu trả lời khác đang đề cập đến onRestart () không được chứa bởi Fragment, Vì vậy, câu trả lời này phù hợp với tôi. Đối với một Fragment, bạn có thể sử dụng onResume ().
Feroz Khan

39

Tôi nghĩ rằng onRestart () hoạt động tốt hơn cho việc này.

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

Bạn có thể viết mã những gì bạn muốn làm khi Hoạt động được khởi động lại (được gọi lại từ sự kiện 'nhấn nút quay lại') bên trong onRestart ().

Ví dụ: nếu bạn muốn làm điều tương tự như bạn làm trong onCreate (), hãy dán mã vào onRestart () (ví dụ: tạo lại giao diện người dùng với các giá trị được cập nhật).


7
Điều này là tầm thường, nhưng tôi phải nói điều đó: rõ ràng tốt hơn là nên chuyển mã onCreate () của bạn sang một phương thức riêng biệt mà sau đó bạn gọi từ cả onCreate () cũng như onRestart () thay vì sao chép dán nó.
Ricardo van den Broek

Bạn cũng có thể chỉ sử dụng onCreate () để tăng các lượt xem và khởi tạo các biến toàn cục và sử dụng onStart () để gán / (lại) thiết lập chúng. Do đó, init () của bạn (hoặc bất cứ thứ gì bạn muốn gọi nó) sẽ được gọi bất cứ khi nào hoạt động bắt đầu; tức là sau onCreate () hoặc sau onRestart ().
jwehrle

Điều này thực sự hữu ích nếu bạn cần khởi động lại ViewModel trong hoạt động của mình. Cho phép nó lấy từ cơ sở dữ liệu một lần nữa, biến thiết lập dụ ...
hugey

34

trong chính:

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

Tôi đoán điều này đi đến hoạt động hiện tại chứ không phải hoạt động trước đó?
Si8

1
Tôi đã gặp vấn đề tương tự, ngoại trừ vấn đề của tôi là Fragment không phải Activity. Vì vậy, tôi làm theo lời khuyên ở đây và nó làm việc: stackoverflow.com/questions/35039512/...
David C.

8

Tôi khuyên bạn nên ghi đè onResume()phương thức trong hoạt động số 1 và trong đó bao gồm mã để làm mới bộ điều hợp mảng của bạn, điều này được thực hiện bằng cách sử dụng[yourListViewAdapater].notifyDataSetChanged();

Đọc phần này nếu bạn gặp sự cố khi làm mới danh sách: Làm mới chế độ xem Danh sách Android


2

Nếu bạn muốn làm mới hoạt động trước đó, giải pháp này sẽ hoạt động:

Trong hoạt động trước mà bạn muốn làm mới:

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

Tôi chỉ có danh mục yêu thích nên khi tôi nhấp vào mục từ mục yêu thích sẽ xuất hiện thông tin như vậy và nếu tôi không thích nó - mục này sẽ bị xóa khỏi Mục yêu thích: vì điều đó tôi làm mới cơ sở dữ liệu và đặt nó thành bộ điều hợp (cho chế độ xem lại) [Tôi chúc bạn sẽ hiểu vấn đề và giải pháp của tôi]


xem xét thêm một số giải thích
Gahan

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

Trong hoạt động trước đây, hãy sử dụng mã này. Thao tác này sẽ thực hiện quá trình chuyển đổi suôn sẻ và tải lại hoạt động khi bạn quay lại bằng cách nhấn nút quay lại.


Bạn có thể thêm một số mô tả vào mã và cảm ơn bạn cho bài viết.
Nelles

0

Nếu không xử lý lệnh gọi lại từ hoạt động chỉnh sửa (với onActivityResult), thì tôi muốn đặt logic mà bạn đã đề cập trong onStart (hoặc có thể trong onRestart), vì có nó trong onResume giống như quá mức cần thiết, vì các thay đổi chỉ xảy ra sau dừng lại.

Ở bất kỳ mức độ nào, hãy làm quen với vòng đời Hoạt động . Ngoài ra, hãy lưu ý đến các phương thức onRestoreInstanceState và onSaveInstanceState, những phương thức này không xuất hiện trong sơ đồ vòng đời khá đẹp.

(Ngoài ra, bạn nên xem lại cách Hướng dẫn sử dụng Notepad xử lý những gì bạn đang làm, mặc dù nó sử dụng cơ sở dữ liệu.)


0

Cách tốt nhất để đạt được nó là sử dụng

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

0

Thử đi

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

}

hoặc trong Fragment

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

}

Và Thêm phương thức này vào onBackPressed () của bạn như

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

Đó là nó...


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

Câu hỏi này đã cũ và câu trả lời được cung cấp đã được gắn cờ để xem xét là Bài đăng chất lượng thấp. Dưới đây là một số hướng dẫn về Làm cách nào để viết một câu trả lời hay? . Có những câu trả lời khác cung cấp câu hỏi của OP, và chúng đã được đăng cách đây một thời gian. Khi đăng câu trả lời, hãy đảm bảo bạn thêm giải pháp mới hoặc giải thích về cơ bản tốt hơn, đặc biệt là khi trả lời các câu hỏi cũ hơn.
help-info.de
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.