Intereting Posts
Android-приложение AppWidget не добавляет на рабочий стол на Lollipop Совместимость с jQuery и мобильным браузером? Подключение ADB с использованием Wi-Fi для не-внедренного устройства Как вы создаете и развертываете более старую версию Android для ионной / кордовой Могу ли я выполнить этот Android-запрос с помощью ContentResolver.query ()? (ЛЕВЫЙ ПРИСОЕДИНЕНИЕ И СЛУЧАЙ) Ошибка Android Studio: не удалось создать виртуальную машину Java Android NumberPicker обертывает значения при изменении отображаемых значений Как выровнять название в центре ActionBar в теме по умолчанию (Theme.Holo.Light) Как сделать просмотр списка прокручиваемым до тех пор, пока последний элемент не окажется поверх экрана Изменение состояния ToggleButton программно, а не автоматически в Android? Ошибка браузера для Android? Прокрутка переполнения div Значки предпочтений Android, не ориентированные на устройствах => Lollipop TextInputLayout Hint не обновляется после обновления библиотеки поддержки Google GridView с незавершенной строкой не прокручивает Использование SupportToolbar для макета телефона и отдельной панели действий для компоновки планшета

Панель действий вверх с фрагментами

У меня есть вкладка Actionbar / viewpager с тремя вкладками: A , B и C. В закладке C (фрагмент) я добавляю еще один фрагмент, скажем, фрагмент D. с

DFragment f= new DFragment(); ft.add(android.R.id.content, f, ""); ft.remove(CFragment.this); ft.addToBackStack(null); ft.commit(); 

Я изменяю панель действий в кнопке onResume DFragment для добавления:

 ActionBar ab = getActivity().getActionBar(); ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); ab.setDisplayHomeAsUpEnabled(true); ab.setDisplayShowHomeEnabled(true); 

Теперь в DFragment, когда я нажимаю кнопку аппаратного (телефонного) «Назад», я возвращаюсь к исходному макету с вкладками (ABC) с выбранным CFragment. Как я могу достичь этой функциональности с помощью кнопки активации?

OnBackStackChangedListener и добавьте этот код в свою Фрагментную активность.

 @Override public void onCreate(Bundle savedInstanceState) { //Listen for changes in the back stack getSupportFragmentManager().addOnBackStackChangedListener(this); //Handle when activity is recreated like on orientation Change shouldDisplayHomeUp(); } @Override public void onBackStackChanged() { shouldDisplayHomeUp(); } public void shouldDisplayHomeUp(){ //Enable Up button only if there are entries in the back stack boolean canback = getSupportFragmentManager().getBackStackEntryCount()>0; getSupportActionBar().setDisplayHomeAsUpEnabled(canback); } @Override public boolean onSupportNavigateUp() { //This method is called when the up button is pressed. Just the pop back stack. getSupportFragmentManager().popBackStack(); return true; } 

Я понял. Просто переопределить onOptionsItemSelected в действии хостинга и всплывать backstack, например

 public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: FragmentManager fm = getSupportFragmentManager(); if (fm.getBackStackEntryCount() > 0) { fm.popBackStack(); } return true; default: return super.onOptionsItemSelected(item);; } } 

Вызов getActionBar().setDisplayHomeAsUpEnabled(boolean); И getActionBar().setHomeButtonEnabled(boolean); В onBackStackChanged() как описано в ответе ниже.

Если у вас есть одно родительское действие и вы хотите, чтобы эта кнопка вверх работала как кнопка «Назад», вы можете использовать этот код:

Добавьте это в onCreate в свой основной класс активности

 getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { int stackHeight = getSupportFragmentManager().getBackStackEntryCount(); if (stackHeight > 0) { // if we have something on the stack (doesn't include the current shown fragment) getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } else { getSupportActionBar().setDisplayHomeAsUpEnabled(false); getSupportActionBar().setHomeButtonEnabled(false); } } }); 

А затем добавьте onOptionsItemSelected так:

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: getSupportFragmentManager().popBackStack(); return true; .... } 

Я обычно использую это все время и кажется довольно законным

Вы можете вернуться с помощью кнопки «вверх», как кнопка «Назад»;

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: super.onBackPressed(); return true; } return super.onOptionsItemSelected(item); } 

Я использовал комбинацию ответов Роджера Гарзона Нието и Сохайлазиза . Мое приложение имеет одну MainActivity и фрагменты A, B, C, которые загружаются в нее. Мой «домашний» фрагмент (A) реализует OnBackStackChangedListener и проверяет размер backStack; Если он меньше единицы, то он скрывает кнопку ВВЕРХ. Фрагменты B и C всегда загружают кнопку возврата (в моем дизайне B запускается с A, а C запускается с B). Сам MainActivity просто выталкивает backstack на кнопку UP UP, и имеет методы для отображения / скрытия кнопки, которую вызывают фрагменты:

Основная деятельность:

 public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: getSupportFragmentManager().popBackStack(); return true; } return super.onOptionsItemSelected(item); } public void showUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } public void hideUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); } 

FragmentA (реализует FragmentManager.OnBackStackChangedListener):

 public void onCreate(Bundle savedinstanceSate) { // listen to backstack changes getActivity().getSupportFragmentManager().addOnBackStackChangedListener(this); // other fragment init stuff ... } public void onBackStackChanged() { // enable Up button only if there are entries on the backstack if(getActivity().getSupportFragmentManager().getBackStackEntryCount() < 1) { ((MainActivity)getActivity()).hideUpButton(); } } 

Фрагмент B, фрагмент C:

 public void onCreate(Bundle savedinstanceSate) { // show the UP button ((MainActivity)getActivity()).showUpButton(); // other fragment init stuff ... } 

Я знаю, что этот вопрос старый, но может быть, кому-то (как и мне) тоже это нужно.

Если ваша деятельность расширяет AppCompatActivity , вы можете использовать более простое (двухэтапное) решение:

1 – Когда вы добавляете фрагмент, не относящийся к дому, просто показывайте кнопку «вверх», сразу после совершения транзакции фрагмента. Как это:

  // ... add a fragment // Commit the transaction transaction.commit(); getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

2 – Затем, когда нажата кнопка ВВЕРХ, вы ее спрячете.

 @Override public boolean onSupportNavigateUp() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); return true; } 

Вот и все.

Это очень хорошее и надежное решение: http://vinsol.com/blog/2014/10/01/handling-back-button-press-inside-fragments/

Парень сделал абстрактный фрагмент, который обрабатывает поведение backPress и переключается между активными фрагментами с использованием шаблона стратегии.

Для некоторых из вас есть, может быть, небольшой недостаток в абстрактном классе …

Вскоре решение из этой ссылки выглядит следующим образом:

 // Abstract Fragment handling the back presses public abstract class BackHandledFragment extends Fragment { protected BackHandlerInterface backHandlerInterface; public abstract String getTagText(); public abstract boolean onBackPressed(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(!(getActivity() instanceof BackHandlerInterface)) { throw new ClassCastException("Hosting activity must implement BackHandlerInterface"); } else { backHandlerInterface = (BackHandlerInterface) getActivity(); } } @Override public void onStart() { super.onStart(); // Mark this fragment as the selected Fragment. backHandlerInterface.setSelectedFragment(this); } public interface BackHandlerInterface { public void setSelectedFragment(BackHandledFragment backHandledFragment); } } 

И использование в деятельности:

 // BASIC ACTIVITY CODE THAT LETS ITS FRAGMENT UTILIZE onBackPress EVENTS // IN AN ADAPTIVE AND ORGANIZED PATTERN USING BackHandledFragment public class TheActivity extends FragmentActivity implements BackHandlerInterface { private BackHandledFragment selectedFragment; @Override public void onBackPressed() { if(selectedFragment == null || !selectedFragment.onBackPressed()) { // Selected fragment did not consume the back press event. super.onBackPressed(); } } @Override public void setSelectedFragment(BackHandledFragment selectedFragment) { this.selectedFragment = selectedFragment; } } 

Это сработало для меня. Переопределить onSupportNavigateUp и onBackPressed, например (код в Котлине);

 override fun onBackPressed() { val count = supportFragmentManager.backStackEntryCount if (count == 0) { super.onBackPressed() } else { supportFragmentManager.popBackStack() } } override fun onSupportNavigateUp(): Boolean { super.onSupportNavigateUp() onBackPressed() return true } 

Теперь в фрагменте, если вы показываете стрелку вверх

 activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) 

Нажатие на нее возвращает вас назад.