Я пытаюсь закрыть текущий фрагмент с помощью Imagebutton.
Я нахожусь во фрагменте-A, и когда я нажимаю кнопку, он превратится во фрагмент-B.
И когда я нажимаю кнопку на фрагменте-B, он превратится в фрагмент-C и закроет фрагмент-B.
Если я нажму кнопку возврата во фрагменте-C, он вернется к фрагменту-A.
Код, который я пробовал, выглядит следующим образом
camera_album = (ImageButton) view.findViewById(R.id.camera_album);
camera_album.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
closefragment();
Fragment fragment = FileBrowserFragment.newInstance(null, null, null) ;
MainActivity.addFragment(LocalFileBrowserFragment.this, fragment) ;
}
});
private void closefragment() {
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
}
Когда я нажимаю кнопку «Назад» на фрагменте-B, он превращается в фрагмент-C.
Но когда я нажимаю кнопку «Назад» на фрагменте-C, он не возвращается к фрагменту-A. Он вернулся к пустому фону. Если я хочу вернуться к фрагменту-A, мне нужно еще раз нажать кнопку «Назад».
ТАК, похоже, не закрывает текущий фрагмент.
Как закончить текущий фрагмент как кнопку возврата в Android?
MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)
??. вам нужно добавить фрагмент в backstak и, соответственно, выскочить то же самоеОтветы:
Из фрагмента A, чтобы перейти к B, замените A на B и используйте
addToBackstack()
раньшеcommit()
.Теперь из фрагмента B, чтобы перейти к C, сначала используйте
popBackStackImmediate()
, это вернет A. Теперь замените A на C, как и в первой транзакции.источник
Я меняю код с
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
к
getActivity().getFragmentManager().popBackStack();
И он может закрыть фрагмент.
источник
Для тех, кому нужно разобраться простым способом
Пытаться
getActivity().onBackPressed();
источник
popBackStack()
иpopBackStackImmediate()
являются более прямыми способами извлечения самого верхнего фрагмента без имитации нажатия кнопки. ИспользованиеonBackPressed()
триггеровOnBackPressedCallback
s; если в будущем вы захотите обрабатывать нажатия кнопки «Назад» специально, вам придется переключиться наpopBackStack()
/,popBackStackImmediate()
чтобы не запускать обратные вызовы программно.getActivity().onBackPressed
делает все, что вам нужно. Он автоматически вызывает метод onBackPressed в родительском действии .источник
Это способ сделать это с помощью Kotlin, я создал кнопку в макете фрагмента, а затем установил onClickListner в onViewCreated.
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) btn_FragSP_back.setOnClickListener { activity?.onBackPressed() } }
источник
Попробуй это:
ft.addToBackStack(null); // ft is FragmentTransaction
Таким образом, когда вы нажимаете клавишу возврата , текущее действие (которое содержит несколько фрагментов) загружает предыдущий фрагмент, а не завершает само себя.
источник
Попробуй это:
public void removeFragment(Fragment fragment){ android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.remove(fragment); fragmentTransaction.commit(); }
источник
Вы можете попробовать эту логику, потому что она у меня работает.
frag_profile profile_fragment = new frag_profile(); boolean flag = false; @SuppressLint("ResourceType") public void profile_Frag(){ if (flag == false) { FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); manager.getBackStackEntryCount(); transaction.setCustomAnimations(R.anim.transition_anim0, R.anim.transition_anim1); transaction.replace(R.id.parentPanel, profile_fragment, "FirstFragment"); transaction.commit(); flag = true; } } @Override public void onBackPressed() { if (flag == true) { FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); manager.getBackStackEntryCount(); transaction.remove(profile_fragment); transaction.commit(); flag = false; } else super.onBackPressed(); }
источник
Button ok= view.findViewById(R.id.btSettingOK); Fragment me=this; ok.setOnClickListener( new View.OnClickListener(){ public void onClick(View v){ getActivity().getFragmentManager().beginTransaction().remove(me).commit(); } });
источник
Если вам нужно обработать действие более конкретно с помощью кнопки возврата, вы можете использовать следующий метод:
view.setFocusableInTouchMode(true); view.requestFocus(); view.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if( keyCode == KeyEvent.KEYCODE_BACK ) { onCloseFragment(); return true; } else { return false; } } });
источник
В своих фрагментах
onCreateView(...)
вы можете удалить представление, позвонивcontainer.removeView(view);
. Поэтому, если вы хотите удалить фрагмент,view
должно быть возвращаемое значениеonCreateView
,например
public View onCreateView(...){ final View view = inflater.inflate(R.layout.your_fragments_layout,container,false); //Do something finishButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ container.removeView(view); } }); return view; }
источник
если тебе нужно в 2020 году
Objects.requireNonNull(getActivity()).onBackPressed();
источник
Попробуй это
getActivity().finish();
источник