뒤로 버튼 및 이전 활동 새로 고침


84

두 가지 활동이있는 경우 :

  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

내가 현재 작업을 완료 할 및 이전 작업을 업데이트하지 않으려면 어떻게
— Mansuu을 ....

@Waza_Be onResume는 나를 위해 전화 하지 마십시오, 이유는 무엇입니까? ( I 시도 onRestart와 onPause도하지만, 그들 중 누구도 호출하지 )
— 메디 Dehghani에게

제 경우에는 Fragment의 활동으로 이동했습니다. 따라서 Activity에서 Fragment로 돌아올 때 다른 답변이 Fragment에 포함되지 않은 onRestart ()를 언급 하므로이 답변이 저에게 효과적이었습니다. Fragment의 경우 onResume ()을 사용할 수 있습니다.
— Feroz Khan

39

나는 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 () 내에서 Activity가 다시 시작될 때 ( '뒤로 버튼 누름'이벤트에서 다시 호출 됨) 수행 할 작업을 코딩 할 수 있습니다.

예를 들어 onCreate ()에서하는 것과 동일한 작업을 수행하려면 onRestart ()에 코드를 붙여 넣습니다 (예 : 업데이트 된 값으로 UI 재구성).


7
이것은 사소한,하지만 난 이 그것을 말 : 분명히 당신이 다음 모두에서 onCreate ()뿐만 아니라 onRestart () 대신 복사본에서 붙여 넣기 # 출 별도의 방법으로에서 onCreate () 코드를 이동 좋을 것.
— Ricardo van den Broek 2015 년

또한 onCreate ()를 사용하여 뷰를 확장하고 전역 변수를 인스턴스화하고 onStart ()를 사용하여 할당 / (재) 설정할 수도 있습니다. 따라서 활동이 시작될 때마다 init () (또는 호출하려는 모든 항목)이 호출됩니다. 즉, onCreate () 이후 또는 onRestart () 이후.
— jwehrle

활동의 ViewModel을 다시 초기화해야하는 경우 매우 유용합니다. ... 그것은 다시 데이터베이스에서 설정 인스턴스 변수를 가져올 수 있습니다
— hugey

34

요점 :

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

나는 이것이 이전 활동이 아닌 현재 활동으로 이동한다고 생각합니까?
— Si8

1
나는 활동이 아닌 조각이라는 점을 제외하고는 동일한 문제가 발생했습니다. 따라서, 여기 조언을 따라 일했다 : stackoverflow.com/questions/35039512/...을
— 데이비드 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();
    }
}

내가 즐겨 찾기 카테고리 만 가지고있어서 즐겨 찾기 항목을 클릭하면 그런 정보가 나타나고 만약 내가 마음에 들지 않으면이 항목은 즐겨 찾기에서 삭제되어야합니다 : 데이터베이스를 새로 고침하고 어댑터 (recyclerview 용)로 설정합니다. 내 문제와 해결책을 이해할 것입니다.]


일부 explaination를 추가하는 것을 고려
— 가한

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

이전 활동에서이 코드를 사용하십시오. 이것은 부드럽게 전환하고 뒤로 버튼을 눌러 돌아올 때 활동을 다시로드합니다.


코드에 설명을 추가하고 게시물에 감사드립니다.
— Nelles

0

편집 활동 (onActivityResult 사용)에서 콜백을 처리하지 않는 경우 onStart (또는 onRestart)에서 언급 한 로직을 넣는 것이 좋습니다. onStop.

어쨌든 활동 라이프 사이클에 익숙해 져야 합니다 . 또한 예쁜 수명주기 다이어그램에 나타나지 않는 onRestoreInstanceState 및 onSaveInstanceState 메서드를 기록해 둡니다.

(또한 메모장 자습서 가 데이터베이스를 사용하지만 수행중인 작업을 처리 하는 방법을 검토 할 가치 가 있습니다.)



0

이 시도

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

}

또는 조각

  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.