我正在转换一个应用程序使用片段使用兼容性库。 现在,目前我有许多活动(a B C D)链接到另一个,D有一个按钮“OK”,当按下调用完成,然后气泡通过onActivityResult()额外破坏C和B。

对于我的前蜂窝片段版本,每个活动都是有效的包装碎片Af Bf Cf Df。所有的活动都是通过startActivityForResult()和onActivityResult()启动的,每个片段都可以愉快地调用getActivity().finish()

我遇到的问题是,在我的蜂窝版本中,我只有一个活动,A,片段Bf, Cf, Df是使用FragmentManager加载的。

我不明白的是,在Df中,当'OK'被按下以删除Df, Cf和Bf片段时,要做什么?

我试着让片段弹出自己的堆栈,但这导致了一个异常。onActivityResult()是无用的,因为我没有加载使用startActivityForResult()的片段。

我是不是完全想错了?我是否应该实现某种侦听器,与父片段或活动通信,以便使用事务管理器进行弹出?


当前回答

您应该让活动处理添加和删除片段,正如CommonsWare所说,使用侦听器。这里有一个例子:

public class MyActivity extends FragmentActivity implements SuicidalFragmentListener {

    // onCreate etc

    @Override
    public void onFragmentSuicide(String tag) {
        // Check tag if you do this with more than one fragmen, then:
        getSupportFragmentManager().popBackStack();
    }
}

public interface SuicidalFragmentListener {
    void onFragmentSuicide(String tag);
}

public class MyFragment extends Fragment {

    // onCreateView etc

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
           suicideListener = (SuicidalFragmentListener) activity;
        } catch (ClassCastException e) {
           throw new RuntimeException(getActivity().getClass().getSimpleName() + " must implement the suicide listener to use this fragment", e);
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // Attach the close listener to whatever action on the fragment you want
        addSuicideTouchListener();
    }

    private void addSuicideTouchListener() {
        getView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              suicideListener.onFragmentSuicide(getTag());
            }
        });
    }
}

其他回答

在同一个片段中关闭一个片段

getActivity().onBackPressed();

科特林 --

requireActivity().onBackPressed()

我不明白的是,在Df中,当'OK'被按下以删除Df, Cf和Bf片段时,要做什么?

第一步:让Df告诉D“哟!我们得到了OK click!”通过调用一个方法,无论是在活动本身上,还是在活动提供的接口实例上。

步骤2:让D通过FragmentManager删除片段。

托管活动(D)知道该活动中还有哪些片段(而不是在其他活动中)。因此,可能影响片段混合的片段内事件应该传播到活动,活动将进行适当的编排移动。

您应该让活动处理添加和删除片段,正如CommonsWare所说,使用侦听器。这里有一个例子:

public class MyActivity extends FragmentActivity implements SuicidalFragmentListener {

    // onCreate etc

    @Override
    public void onFragmentSuicide(String tag) {
        // Check tag if you do this with more than one fragmen, then:
        getSupportFragmentManager().popBackStack();
    }
}

public interface SuicidalFragmentListener {
    void onFragmentSuicide(String tag);
}

public class MyFragment extends Fragment {

    // onCreateView etc

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
           suicideListener = (SuicidalFragmentListener) activity;
        } catch (ClassCastException e) {
           throw new RuntimeException(getActivity().getClass().getSimpleName() + " must implement the suicide listener to use this fragment", e);
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // Attach the close listener to whatever action on the fragment you want
        addSuicideTouchListener();
    }

    private void addSuicideTouchListener() {
        getView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              suicideListener.onFragmentSuicide(getTag());
            }
        });
    }
}
parentFragmentManager.apply {
    val f = this@MyFragment
    beginTransaction().hide(f).remove(f).commit()
}

虽然这可能不是最好的方法,但我能想到的最接近的等效方法是支持/兼容性库

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

or

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

否则。

此外,你可以使用后台和弹出它。但是请记住,这个片段可能不在后堆栈上(取决于把它放在那里的fragmenttransaction ..),或者它可能不是最后一个进入堆栈的,所以弹出堆栈可能会删除错误的一个…