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


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 시도 onRestartonPause도하지만, 그들 중 누구도 호출하지 )
메디 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.