Кнопка возврата к fragmentу

Теперь у меня есть активность, содержащая fragmentы

[1], [2], [3], [4]

Если нажать кнопки [3], его можно перенаправить на [4]

Я хотел бы реализовать кнопку «Назад», как показано ниже.

при нажатии на [4], он возвращается к [3]

при нажатии на [3], он возвращается к [2]

при нажатии на [1], активность завершается ();

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

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if( keyCode==KeyEvent.KEYCODE_BACK) { finish(); } return super.onKeyDown(keyCode, event); } 

Хорошо, ребята, я наконец нашел хорошее решение.

В вашей функции onCreate () в вашей работе, в которой ваши fragmentы добавят слушателя с заменой backstack следующим образом:

  fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { List f = fragmentManager.getFragments(); //List f only returns one value Fragment frag = f.get(0); currentFragment = frag.getClass().getSimpleName(); } }); 

(Также добавление моего fragmenManager объявляется в действия O Теперь каждый раз, когда вы меняете fragment, текущий fragment String станет именем текущего fragmentа. Затем в действиях onBackPressed () вы можете управлять действиями вашей кнопки возврата так:

  @Override public void onBackPressed() { switch (currentFragment) { case "FragmentOne": // your code here (Maybe dialog) return; case "FragmentTwo": // your code here return; default: fragmentManager.popBackStack(); // default action for any other fragment (return to previous) } } 

Я могу подтвердить, что этот метод работает для меня.

Это сработало для меня.

-Add .addToBackStack (null), когда вы вызываете новый fragment из активности.

  FragmentTransaction mFragmentTransaction = getFragmentManager() .beginTransaction(); .... mFragmentTransaction.addToBackStack(null); 

-Добавить onBackPressed () к вашей деятельности

  @Override public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() == 0) { this.finish(); } else { getFragmentManager().popBackStack(); } } 

Самый простой способ:

onResume () :

 @Override public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { // handle back button's click listener Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show(); return true; } return false; } }); } 

Редактировать 1 : Если fragment имеет EditText .

 private EditText editText; 

onCreateView () :

 editText = (EditText) rootView.findViewById(R.id.editText); 

onResume () :

 @Override public void onResume() { super.onResume(); editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { editText.clearFocus(); } return false; } }); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { // handle back button's click listener Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show(); return true; } return false; } }); } 

Примечание. Он будет работать, если у вас есть EditText в fragmentе.

Готово

Это рабочее решение для меня:

 dialog.setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { // DO WHAT YOU WANT ON BACK PRESSED return true; } return false; } }); 

Изменить: вы можете заменить диалог getView() для fragmentов.

Вы можете использовать это .. Работали для меня ..

Кажется, что fragment [3] не удаляется из представления, когда нажата задняя часть, поэтому вам нужно сделать это вручную!

Прежде всего, не используйте replace (), но вместо этого используйте remove и добавьте отдельно. Кажется, что replace () не работает должным образом.

Следующая часть этого метода переопределяет метод onKeyDown и удаляет текущий fragment каждый раз при нажатии кнопки «Назад».

  @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (getSupportFragmentManager().getBackStackEntryCount() == 0) { this.finish(); return false; } else { getSupportFragmentManager().popBackStack(); removeCurrentFragment(); return false; } } return super.onKeyDown(keyCode, event); } public void removeCurrentFragment() { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.f_id); } 

Попробуйте это простое решение:

В вашей деятельности реализуйте onBackPressed

  @Override public void onBackPressed() { if (getSupportFragmentManager().getBackStackEntryCount() > 1) { getSupportFragmentManager().popBackStack(); } else { finish(); } } 

Это будет работать, если вы хотите поместить верхний fragment на каждом обратном нажатии. Примечание . – При добавлении fragmentа к активности всегда добавляйте транзакцию в задний стек, чтобы это работало

Еще лучшим решением могло бы стать следование шаблону проектирования, так что событие нажатия кнопки «Назад» будет распространяться от активного fragmentа до главной операции. Итак, это похоже на то, что если один из активных fragmentов потребляет back-press, активность не будет действовать, и наоборот.

Один из способов сделать это состоит в том, чтобы все ваши fragmentы расширяли базовый fragment, который имеет абстрактный метод boolean onBackPressed ().

 @Override public boolean onBackPressed() { if(some_condition) // Do something return true; //Back press consumed. } else { // Back-press not consumed. Let Activity handle it return false; } } 

Следите за активным fragmentом внутри своей деятельности, а внутри его onBackPressed обратный вызов пишите что-то вроде этого

 @Override public void onBackPressed() { if(!activeFragment.onBackPressed()) super.onBackPressed(); } } 

Этот пост имеет этот шаблон, подробно описанный

В этом случае я реализую функцию onBackPressed () из Activity:

 @Override public void onBackPressed() { super.onBackPressed(); FragmentManager fm = getSupportFragmentManager(); MyFragment myFragment = (MyFragment) fm.findFragmentById(R.id.my_fragment); if((myFragmen.isVisible()){ //Do what you want to do } } 

Как это работает для вас тоже.

Вы можете использовать getFragmentManager().popBackStack() в базовом Fragment чтобы вернуться.

Решение для нажатия или обратного вызова в fragmentе.

Как я решил свою проблему, я уверен, что это тоже поможет:

1.Если у вас нет текстового поля редактирования в вашем fragmentе, вы можете использовать ниже код

Здесь MainHomeFragment является основным fragmentом (когда я нажимаю кнопку со второго fragmentа, мне тоже потребуется MainHomeFragment)

  @Override public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ MainHomeFragment mainHomeFragment = new SupplierHomeFragment(); android.support.v4.app.FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment); fragmentTransaction.commit(); return true; } return false; } }); } 

2.Если у вас есть еще один fragment с именем Somefragment и он имеет текстовое поле Edit, вы можете сделать это таким образом.

 private EditText editText; 

Затем в,

 onCreateView(): editText = (EditText) view.findViewById(R.id.editText); 

Затем переопределите OnResume,

 @Override public void onResume() { super.onResume(); editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { editTextOFS.clearFocus(); getView().requestFocus(); } return false; } }); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ MainHomeFragment mainHomeFragment = new SupplierHomeFragment(); android.support.v4.app.FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment); fragmentTransaction.commit(); return true; } return false; } }); } 

Это все люди (amitamie.com) 🙂 😉

Вам также необходимо проверить событие Action_Down или Action_UP. Если вы не будете проверять, то методKey () вызовет 2 раза.

 getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (keyCode == KeyEvent.KEYCODE_BACK) { Toast.makeText(getActivity(), "Back Pressed", Toast.LENGTH_SHORT).show(); return true; } } return false; } }); 

Очень хорошо работает для меня.

Обязательно добавьте следующее:

 if (event.getAction()!=KeyEvent.ACTION_DOWN) return true; 

в блоке onKey кода, чтобы избежать вызова вызова дважды.

если вы используете webview внутри fragmentа, чем используете его в методе onCreateView

 webView.setOnKeyListener(new View.OnKeyListener(){ @Override public boolean onKey(View view, int i, KeyEvent keyEvent) { if((i==KeyEvent.KEYCODE_BACK)&& webView.canGoBack()){ webView.goBack(); return true; } return false; } }); 

и импортировать этот class

 import android.view.KeyEvent; 

я использую метод для изменения fragmentов, который имеет следующий код

  getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit).replace(R.id.content_frame, mContent, mContent.getClass().getSimpleName()).addToBackStack(null) .commit(); 

и для кнопки «Назад».

 @Override public void onBackPressed() { // note: you can also use 'getSupportFragmentManager()' FragmentManager mgr = getSupportFragmentManager(); if (mgr.getBackStackEntryCount() == 1) { // No backstack to pop, so calling super finish(); } else { mgr.popBackStack(); } } 

важно отметить, что я использую 1 для проверки getBackStackEntryCount, потому что, если вы не используете его и используете 0, пользователь не видит ничего для последней кнопки возврата.

Interesting Posts

Строки кадра данных заказа согласно вектору с определенным порядком

Каким будет лучший способ создать мою программу?

Где я могу найти подробное сравнение фреймворков Java XML?

Почему эта программа Java заканчивается, несмотря на то, что, по-видимому, она не должна (а не)?

Как я могу зашифровать SSH 840 SSD с помощью Bitlocker?

Можно ли использовать сканер, подключенный к другому компьютеру на моем компьютере?

knockoutjs: можно ли создать зависимую функцию Observable с параметром?

Каталог документов iPhone и UIFileSharingEnabled, скрывающие определенные документы

Преобразование строкового выражения в Integer Value с использованием C #

Кудрявые скобки в стрелочных функциях

Открытие нового окна в пространствах с Mac OS X

Как реализована среда выполнения обработки исключений C ++?

Точки последовательности и частичный порядок

dplyr мутировать / заменять на подмножество строк

Почему на клавиатуре есть два набора клавиш Ctrl, Alt и Shift?

Давайте будем гением компьютера.