删除FragmentTransaction中的片段无法应用于

时间:2018-04-06 13:11:38

标签: android android-fragments fragmenttransaction

我有关于关闭片段的问题。

我无法通过以下链接在自定义片段本身内关闭片段的原因

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

似乎是继承,因为我的自定义Fragment继承自..

extends android.support.v4.app.Fragment

Android Studio正在抱怨remove(),"这个"

中的参数
  FragmentTransaction中的

remove(android.app.Fragment)无法应用于se.fragmenttest.app.myfrafmentest180406.MyFragment)

奇怪的是,同样的调用似乎可以在MainActivity中实现Fragment的实例化。

全班

public class MyFragment extends android.support.v4.app.Fragment {

private View fragmentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup containter, Bundle savedInstanceState) {

    fragmentView = inflater.inflate(R.layout.fragment_layout, containter, false);

    Button button = (Button) fragmentView.findViewById(R.id.okbutton_id);

    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            closeFragment();
        }
    }
    );

    return fragmentView;
}

private void closeFragment() {

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

}

修改

MainActivity的代码

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    MyFragment myFragment = new MyFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.container, myFragment, "myfragment");
    fragmentTransaction.commit();
    fragmentTransaction.remove(myFragment);


}

我尝试删除MainActiviy中的片段,然后就可以了。还有更多 - 我可以将引用放在remove()中,而我不能在Fragment类中使用

2 个答案:

答案 0 :(得分:0)

使用此

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

(或)使用可以指定标签

示例参考

您可以按名称弹出片段。在向后堆栈添加片段时,只需给它们命名即可。

fragmentTransaction.addToBackStack("fragB");
fragmentTransaction.addToBackStack("fragC");

然后在Fragment_C中,使用名称... fragB弹出后台堆栈并包含POP_BACK_STACK_INCLUSIVE

someButtonInC.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        FragmentManager fm = getActivity()
                .getSupportFragmentManager();
        fm.popBackStack ("fragB", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
}); 

答案 1 :(得分:0)

我现在不在我的主电脑上,所以无法检查......

但我认为您需要致电getSupportFragmentManager()而不是getFragmentManager()

修改

现在我回到我的电脑,我可以确认这是我上面所说的。您发布活动代码也很有帮助。

在您的MainActivity中,您可以致电:

MyFragment myFragment = new MyFragment(); FragmentManager fragmentManager = getSupportFragmentManager();

即。你打电话给getSupportFragmentManager()这是正确的,以及为什么会有效。

..但在您的片段中,您可以调用标准getFragmentManager(),如下所示:

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

当片段扩展支持片段时,当您尝试拨打this时,无法找到它。但是,如果您将以上行更改为:

getActivity().getSupportFragmentManager().beginTransaction().remove(this);

this将不再被发现,您的代码应该运行。