如何关闭当前片段使用按钮一样的后退按钮?

我尝试使用 ImageButton 关闭当前片段。

我在片段 A 中,当我点击按钮时,它将转向片段 B。

And when I click the button at Fragment-B , it will turn to the Fragment-C and close the Fragment-B.

If I click the back button at Fragment-C , it will back to the 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 的后退按钮时,它转到片段 C。

但是当我点击片段 C 上的返回按钮时,它并没有返回片段 A。 它回到了空的背景。如果我想回到片段 A,我必须再次点击返回按钮。

所以,它似乎没有完全关闭当前的碎片。

如何像 Android 的后退按钮一样完成当前的片段?

301262 次浏览

我把密码改成了

getActivity().getFragmentManager().beginTransaction().remove(this).commit();

getActivity().getFragmentManager().popBackStack();

它会弹出最上面的碎片

试试这个:

ft.addToBackStack(null);   // ft is FragmentTransaction

So, when you press back-key, the current activity (which holds multiple fragments) will load previous fragment rather than finishing itself.

从片段 A 到 B,用 B 代替 A,在 commit()之前使用 addToBackstack()

现在从片段 B,到 C,首先使用 popBackStackImmediate(),这将带回 A。现在用 C 替换 A,就像第一个事务一样。

对于那些需要找到简单方法

试试 getActivity().onBackPressed();

试试这个:

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

如果你需要使用后退按钮来处理这个动作,你可以使用以下方法:

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

这是 Kotlin 的做法,我在片段布局中创建了按钮,然后在 onViewCreated 中设置 onclickListner。

根据@Viswanath-Lekshmanan 的评论

override fun onViewCreated(view: View?, savedInstanceState: Bundle?)
{
super.onViewCreated(view, savedInstanceState)


btn_FragSP_back.setOnClickListener {
activity?.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();
}
});

试试这个

getActivity().finish();

你可以试试这个逻辑,因为它对我有效。

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

In your Fragments onCreateView(...) you can remove a view by calling 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;
}

用于删除当前片段 B 并导航到堆栈回来(其他片段 A) :

private fun navigateToBackStack() {
requireActivity().supportFragmentManager
.beginTransaction()
.remove(this)
.commit()
requireActivity().supportFragmentManager.popBackStack()
}

GL