戻るボタンと前のアクティビティの更新


84

2つのアクティビティがある場合:

  1. ファイルのリストと最終変更時刻
  2. ファイル編集アクティビティ

ユーザーはリストからファイルを選択し、ファイル編集アクティビティに移動します。編集が完了したら、ユーザーは戻るボタンを押してファイルリストに戻ります。

リストは再ロードされないため、編集したばかりのファイルの変更時刻に誤った値が表示されます。

戻るボタンを押した後にファイルリストを更新する適切な方法は何ですか?

この例では、データベースが使用されておらず、ArrayAdapterのみが使用されていることを前提としています。


1
onRestart()の方がうまくいくはずです。onResume()は2回呼び出され、onRestart()は戻るボタンを押したときにのみ呼び出されます。
サラ坂本

回答:


108

1つのオプションは、最初のアクティビティの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 .... 2018

@Waza_BeonResumeは私に呼ばれません、理由は何ですか?(私が試したonRestartonPauseあまりにも、それらのどれも呼び出されません
メフディDehghani

私の場合、フラグメントからアクティビティに移動しました。したがって、アクティビティからフラグメントに戻るとき、他の回答がフラグメントに含まれていないonRestart()に言及しているので、この回答は私にとってはうまくいきました。フラグメントの場合、onResume()を使用できます。
フェローズカーン

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()内で、アクティビティが再起動されたとき(イベントの「戻るボタンが押された」から再度呼び出されたとき)に実行する操作をコーディングできます。

たとえば、onCreate()で行うのと同じことを行いたい場合は、コードをonRestart()に貼り付けます(たとえば、更新された値でUIを再構築します)。


7
これは些細なことです、言わなければなりません。onCreate()コードを別のメソッドに移動し、コピーして貼り付けるのではなく、onCreate()とonRestart()の両方から呼び出す方がよいことは明らかです。
Ricardo van den Broek 2015

onCreate()を使用してビューを拡張し、グローバル変数をインスタンス化し、onStart()を使用してそれらを割り当て/(再)設定することもできます。したがって、アクティビティが開始されるたびに、init()(または呼び出したいもの)が呼び出されます。つまり、onCreate()の後またはonRestart()の後。
jwehrle

これは、アクティビティのViewModelを再初期化する必要がある場合に非常に便利です。データベースから再度フェッチして、インスタンス変数を設定します...
巨大な2018

34

主に:

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

これは前のアクティビティではなく、現在のアクティビティに当てはまると思いますか?
Si8 2016年

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用)[お願いします私の問題と解決策を理解します]


説明を追加することを検討してください
Gahan

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

前のアクティビティでは、このコードを使用します。これにより、スムーズに移行し、戻るボタンを押して戻ったときにアクティビティを再読み込みします。


コードに説明を追加して、投稿していただきありがとうございます。
ネレス

0

編集アクティビティ(onActivityResultを使用)からのコールバックを処理しない場合は、onResumeに含めることはやり過ぎのように見えるため、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.