2016-06-15 6 views
3

問題の説明:onBackPressedはrecreate()の後に呼び出しません

私のアプリケーションは主にアクティビティとアクティビティを設定しています。設定アクティビティを終了するたびに、メインアクティビティが再作成されます。

メインアクティビティは、アクションバーとバックボタン(ハードウェアまたはポップアップバー)のホームボタンの2つの場所でfinish()を使用して閉じることができます(App exit)。

ホームボタンは問題なく動作しますが、[戻る]ボタンは開始時に機能しますが、ユーザが[設定アクティビティ]にあってそれを閉じてメインアクティビティに戻ると、onBackPressed()

レクリエーションを削除すると、[戻る]ボタンは[ホーム]ボタンと同じように正常に機能します。

誰かが理由を知っているなら、戻るボタンを使いこなすのはなぜですか?

ありがとうございました。関連するコードの

パーツ:

主な活動:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 

     // Open Settings Activity 
     case R.id.menuSettings: 

      Intent intent = new Intent(this, SettingsActivity.class); 
      startActivityForResult(intent, REQUEST_SETTINGS); 

      return true; 

     // Close the App 
     case android.R.id.home: 

      finish(); 

      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode != RESULT_OK) { 

     return; 
    } 

    switch (requestCode) { 

     case REQUEST_SETTINGS: 

      // Recreate activity 
      recreate(); 

      break; 
    } 
} 

// Close App on Back Button Click 
@Override 
public void onBackPressed() { 
    super.onBackPressed(); 

    finish(); 
} 

}

+0

ランチャーモードについては、https://developer.android.com/guide/topics/manifest/activity-element.html#lmode – Raghunandan

+0

をお読みください。再作成されたコードは何ですか? –

+0

私もこの問題があります。しかし、すべてのデバイスではありません!すべてのエミュレータ(私がテストした)では正しく動作します。物理的なデバイスではありません。私は何が起こっているのか理解できません。 –

答えて

0

私は解決策を見つけた...

代がrecreate()メソッドを呼び出す前に完了する必要があるようです。私はそれをonResumeの中に呼び出して、onActivityResultメソッドの中で呼んでいました。

私は、そのプロセスを完了するために少し休憩しました(私の場合、100ミリ秒はうまくいった)。

// Use this instead of calling recreate() directly. 
// This will call recreate() after 100 milliseconds, ASYNCHRONOUSLY: 
new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       recreate(); 
      } 
     }, 100); 
0

あなたの仕上げはあなたがsuper.onBackPressedを行うので、期待通りに動作しない場合があります():

この

は私のソリューションです。

もう1つのメモは、あなたのアプリを終了させず、アクティビティを終了するだけです。バックスタックに別のアクティビティがある場合は、そのアクティビティが開きます。これはあなたのアプリケーションロジックには問題ありませんが、心に留めておいてください。

その他:問題を再現できないため、問題が他の場所にある可能性があります。これは問題を再現するために使用したコードです。

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       recreate(); 
      } 
     }); 
    } 

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

私はちょうどこれが古い質問であることを認識しました。あなたがまだそれを持っているなら、MainActivityの完全なコードを提供してください。私は他人を助けることができるように答えを更新します。

関連する問題