Подтвердить что ты не робот

Кнопка возврата ActionBarActivity не выскользнула из задней части

Я использую этот шаблон https://github.com/kanytu/android-material-drawer-template только для того, чтобы опробовать material design, поэтому я реализовал несколько фрагментов, некоторые из которых имеют веб-просмотры, которых нет.

Моя проблема в том, что при переключении между фрагментами я вижу, как они успешно добавляются в backstack

getFragmentManager().beginTransaction().replace(R.id.container, new FAQ()).addToBackStack("FAQ").commit();

Но когда я нажимаю кнопку "Назад", он просто закрывает приложение.

Когда я меняю его на использование Activity вместо ActionBarActivity, навигация работает отлично, но я теряю некоторые другие функции.

На задней панели есть надпись

@Override
public void onBackPressed() {
   if (mNavigationDrawerFragment.isDrawerOpen())
       mNavigationDrawerFragment.closeDrawer();
   else
       super.onBackPressed();
}

но даже если это удалено, это все равно произойдет. Я думаю, что проблема лежит где-то в super.onBackPressed

Есть ли какая-либо причина, по которой ActionBarActivity сломает кнопку "Назад"?

4b9b3361

Ответ 1

Недавно я прочитал сообщение об этом, извините, я больше не могу его найти... Но в основном, он объяснил, что основной функцией кнопки "Назад" является завершение текущего Activity.С >

Фактически, согласно официальная документация onBackPressed():

Вызывается, когда активность обнаруживает нажатие на клавишу с обратной стороны. Реализация по умолчанию просто завершает текущую активность, но вы можете переопределить ее, чтобы делать все, что хотите.

И казалось бы, что даже если кнопка "назад" использовалась для загрузки backstack до 5.0, Google изменил бы это поведение на новый ActionBarActivity.

Со своей стороны, я использовал какой-то workarround, который работает для меня, но это может не сработать для всех, в зависимости от вашей реализации навигации.

Но в случае, если это может быть полезно кому-то, вот оно:

@Override
public void onBackPressed()
{
    if (mDrawerLayout.isDrawerOpen()) {
        mDrawerLayout.closeDrawer();
    } else if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

Таким образом, ActionBarActivity.onBackPressed() вызывается только тогда, когда стопка backstack пуста, и в этом случае она уничтожает ActionBarActivity.

Ответ 2

Вы должны проверить "getFragmentManager", а "getSupportFragmentManager" соответствует вашей активности и действиям или нет.

Потому что в действии:

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}

в FragmentActivity:

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}

Мы можем видеть тот же код, который уже обрабатывал поп-фрагменты backstatck. В моей ситуации я использовал actionbaractivity (extends FragmentAcvitiy), но я также использовал "getFragmentManager", поэтому я получил ту же ошибку, что и вы. После того, как я заменил "getFragmentManager" на "getSupportFragmentManager" , это нормально! Вы также можете заменить "actionbaractiviy" на "Activity", чтобы устранить эту проблему.

Обязательно убедитесь, что "getFragmentManager" соответствует "Activity", "getSupportFragmentManager" совпадению "FragmentActivity (ActionbarActivity)".

Если вы хотите добавить панель действий на уровне API 11 или выше, вы можете увидеть ниже:

https://developer.android.com/guide/topics/ui/actionbar.html#Adding

На уровне API 11 или выше Панель действий включена во все действия, в которых используется тема Theme.Holo(или один из ее потомков), который является темой по умолчанию, когда либо атрибут targetSdkVersion, либо minSdkVersion установлен на "11" или выше. Если вам не нужна панель действий для активности, установите тему активности в Theme.Holo.NoActionBar.