2016-06-15 4 views
3

Описание проблемы:onBackPressed not calls after recreate()

Мое приложение имеет Основное действие и деятельность по настройке. После каждого закрытия действия «Настройки» основная активность воссоздается.

Основная деятельность может быть закрыта (выход приложения) финишем() в двух местах: кнопка «Дом» в панели действий и кнопка «Назад» (аппаратная или всплывающая панель).

Кнопка «Дом» работает без проблем, кнопка «Назад» работает с самого начала, но если пользователь находился в «Действиях по настройке», закрыл ее и вернул в «Основная активность», функция 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().

Другое примечание: финиш не закрывает ваше приложение, оно только завершает работу. Если есть другая активность в backstack, она откроет ее. Возможно, это очень хорошо в вашей логике приложения, но помните об этом.

Что-то еще: я не могу воспроизвести вашу проблему, поэтому ваша проблема может быть где-то в другом месте. Это код, который я использовал для воспроизведения вашей проблемы:

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, и я обновлю ответ, чтобы мы могли помочь другим.