如何使用按钮像后退按钮关闭当前片段?

Wun*_*Wun 75 android android-fragments activity-finish

我尝试使用Imagebutton关闭当前片段.

我在Fragment-A中,当我点击按钮时它将转向Fragment-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();
}
Run Code Online (Sandbox Code Playgroud)

当我点击片段B的后退按钮时,它会转到Fragment-C.

但是当我单击Fragment-C上的后退按钮时,它不会返回到Fragment-A.它回到了空背景.如果我想回到Fragment-A,我必须再次单击后退按钮.

所以,似乎并没有完成当前片段的关闭.

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

Wun*_*Wun 115

我改变了代码 getActivity().getFragmentManager().beginTransaction().remove(this).commit();

getActivity().getFragmentManager().popBackStack();
Run Code Online (Sandbox Code Playgroud)

它可以关闭片段.

  • getActivity()onBackPressed(); 这会做你所解释的. (31认同)
  • @ suomi35不。当您需要重写onBackPressed()时,您将面临这样的实现问题 (3认同)
  • 不要忘记使用“getSupportFragmentManager()”,以防“getFragmentManager()”不适合您 (3认同)
  • 它也关闭活动!只需要关闭片段。 (2认同)

S.D*_*.D. 69

从片段A到B,用A替换A并使用addToBackstack()之前commit().

现在从Fragment B,到C,首先使用popBackStackImmediate(),这将带回A.现在用C替换A,就像第一次交易一样.

  • 对于usinf popStackImmediate():-> getView()。setOnKeyListener(new View.OnKeyListener(){@Override public boolean onKey(View v,int keyCode,KeyEvent event){if(keyCode == KeyEvent.KEYCODE_BACK){getActivity() .getSupportFragmentManager()。popBackStackImmediate();返回true;}返回false;}}); (2认同)

Vis*_*nan 57

对于那些需要弄清楚简单方法的人

尝试 getActivity().onBackPressed();

  • @ArpitJ。在调用 onAttach() 之前它只是 null,片段在没有 Activity 的情况下无法生存。 (2认同)
  • `popBackStack()` 和 `popBackStackImmediate()` 是弹出最顶层片段的更直接方法,无需模拟按下按钮。使用 `onBackPressed()` 会触发 `OnBackPressedCallback`;如果将来您想专门处理“后退”按钮按下操作,则必须切换到“popBackStack()”/“popBackStackImmediate()”以避免以编程方式触发回调。 (2认同)

Far*_*aev 6

getActivity().onBackPressed做你需要的一切。它会自动调用父活动中的onBackPressed方法。


Abd*_*man 6

这是执行此操作的 Kotlin 方式,我在片段布局中创建了按钮,然后在 onViewCreated 中设置了 onClickListner。

根据@Viswanath-Lekshmanan 的评论

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

     btn_FragSP_back.setOnClickListener {
        activity?.onBackPressed()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这将关闭活动,而不是片段 (2认同)

小智 5

尝试这个:

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();
}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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();
}
Run Code Online (Sandbox Code Playgroud)