Кнопка возврата к фрагменту

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

[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); } 

Solutions Collecting From Web of "Кнопка возврата к фрагменту"

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

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

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

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

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

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

  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 : Если фрагмент имеет 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 в фрагменте.

Готово

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

 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() для фрагментов.

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

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

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

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

  @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); } 

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

Один из способов сделать это состоит в том, чтобы все ваши фрагменты расширяли базовый фрагмент, который имеет абстрактный метод 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; } } 

Следите за активным фрагментом внутри своей деятельности, а внутри его обратного вызова 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 чтобы вернуться.

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

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

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

Здесь MainHomeFragment является основным фрагментом (когда я нажимаю кнопку со второго фрагмента, мне потребуется слишком 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.Если у вас есть другой фрагмент с именем 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 кода, чтобы избежать вызова вызова дважды.

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

  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, пользователь не видит ничего для последней кнопки возврата.