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

时间:2013-12-28 09:24:19

标签: android android-fragments activity-finish

我尝试使用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的后退按钮?

14 个答案:

答案 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();