我尝试使用Imagebutton关闭当前片段。
我在片段A中,当我点击按钮时它将转向片段-B。
当我点击Fragment-B上的按钮时,它将转向Fragment-C并关闭Fragment-B。
如果我点击Fragment-C的后退按钮,它将返回Fragment-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的后退按钮时,它会转到Fragment-C。
但是当我单击Fragment-C上的后退按钮时,它不会返回到Fragment-A。 它回到了空背景。如果我想回到Fragment-A,我必须再次点击后退按钮。
所以,似乎没有关闭当前的片段完成。
如何完成当前片段,如Android的后退按钮?
答案 0 :(得分:103)
我从getActivity().getFragmentManager().beginTransaction().remove(this).commit();
到
getActivity().getFragmentManager().popBackStack();
它可以关闭片段。
答案 1 :(得分:56)
从片段A转到B,将A替换为B并在addToBackstack()
之前使用commit()
。
现在从片段B转到C,首先使用popBackStackImmediate()
,这将带回A.现在将A替换为C,就像第一次交易一样。
答案 2 :(得分:48)
对于那些需要弄清楚简单方法的人
尝试getActivity().onBackPressed();
答案 3 :(得分:4)
试试这个:
ft.addToBackStack(null); // ft is FragmentTransaction
因此,当您按后退键时,当前活动(包含多个片段)将加载上一个片段而不是自行完成。
答案 4 :(得分:3)
这是Kotlin这样做的方法,我在片段布局中创建了按钮,然后在onViewCreated中设置了onClickListner。
根据@ Viswanath-Lekshmanan评论
override fun onViewCreated(view: View?, savedInstanceState: Bundle?)
{
super.onViewCreated(view, savedInstanceState)
btn_FragSP_back.setOnClickListener {
activity.onBackPressed()
}
}
答案 5 :(得分:2)
试试这个:
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();
}
答案 6 :(得分:2)
getActivity().onBackPressed
可以满足您的一切需求。它会自动调用父活动中的 onBackPressed 方法。
答案 7 :(得分:2)
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();
}
});
答案 8 :(得分:2)
您可以尝试使用此逻辑,因为它对我有用。
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();
}
答案 9 :(得分:1)
如果您需要使用后退按钮更具体地处理操作,可以使用以下方法:
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;
}
}
});
答案 10 :(得分:0)
在片段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;
}
答案 11 :(得分:0)
如果您需要在2020年
Objects.requireNonNull(getActivity()).onBackPressed();
答案 12 :(得分:0)
只需关闭活动
getActivity().onBackPressed();
答案 13 :(得分:-6)
尝试这个
getActivity().finish();