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


85

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

我在Fragment-A中,当我单击按钮时它将变为Fragment-B。

当我单击“片段B”处的按钮时,它将转到“片段C”并关闭“片段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处的后退按钮时,它变为片段C。

但是,当我单击Fragment-C上的后退按钮时,它不会返回到Fragment-A。它回到空的背景。如果要返回至Fragment-A,则必须再次单击“后退”按钮。

所以,似乎没有关闭当前片段完整。

如何完成当前片段,如Android的“后退”按钮?


这是什么MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)??。您需要将片段添加到backstak并相应地弹出该片段
Raghunandan 2013年

在函数addFragment中添加了片段。
2013年

添加片段到什么和一种活动方法?
Raghunandan

2
getActivity()。onBackPressed(); 可以做到这一点
Viswanath Lekshmanan'5

Answers:


81

从片段A转到B,将A替换为B并addToBackstack()在之前使用commit()

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


4
对于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;}});
Yash Agrawal

130

我将代码从 getActivity().getFragmentManager().beginTransaction().remove(this).commit();

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

它可以关闭片段。


35
getActivity()。onBackPressed(); 可以做到这一点。
Viswanath Lekshmanan'5

4
@ suomi35不。当需要重写onBackPressed()时,您将面临这种实现的问题
Le_Enot

似乎没有用。在2016年,进入setNavigationOnClickListener无效。

1
@ViswanathLekshmanan我认为这应该是答案,而不是评论。以及已接受的答案。
弗朗西斯科·罗梅罗

1
它也关闭活动!仅片段关闭是必需的。
Zon

70

对于那些需要找出简单方法的人

尝试 getActivity().onBackPressed();


getActivity()可以多次为null。
Arpit J.19年

1
@ArpitJ。在调用onAttach()之前它只有null,没有活动就无法存在一个片段。
Tamim Attafi

@TamimAttafi是的,但是我指的是轮换或活动完成的情况,由于某些原因,片段实例仍然存在,因此它将返回null。
Arpit J.

popBackStack()并且popBackStackImmediate()是无需模拟按钮即可弹出最上面片段的更直接方法。使用onBackPressed()触发器OnBackPressedCallbacks; 如果将来您想专门处理“后退”按钮的按下操作,则必须切换到popBackStack()/popBackStackImmediate()以避免通过编程方式触发回调。
诺兰·艾米

您可以将此代码放入Fragment的按钮的onclick方法中。
Anon



4

您可以尝试此逻辑,因为它对我有用。

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

4

这是Kotlin的一种方式,我已经在片段布局中创建了按钮,然后在onViewCreated中设置了onClickListner。

根据@ Viswanath-Lekshmanan的评论

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

     btn_FragSP_back.setOnClickListener {
        activity?.onBackPressed()
    }
}

这关闭了活动,而不是片段
nibbana

3

试试这个:

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

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

3
尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以提高其长期价值。
rollstuhlfahrer'3

这个简单的代码实际上通过单击确定或关闭按钮来删除当前片段视图。我用它来退出显示为片段的灯光设置面板,然后返回到“活动”。抱歉,在Android 8下,我认为管理多个Fragment不太实用。
Bruno L.

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

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

-7

试试这个

getActivity().finish();

1
尝试更多地解释您的答案,以便OP和其他人易于理解,以后再回到这个问题
Aman Chhabra

7
这关闭了整个活动,而不是片段
busuu

它帮助了我。那些想要更多信息的人可以用谷歌搜索。无需在此处复制粘贴官方文档。
Alesha170

如果您使用的BottomNavigationView通常具有一个活动,则此命令将关闭应用程序,而不是返回上一个片段。
阿里顿·奥利维拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.