如何得到一个片段去除自己,即完成()相当于?

我正在转换应用程序使用兼容性库使用片段。 现在我有一些活动(ABCD)链接到另一个,D有一个button“OK”,当按下button完成,然后通过onActivityResult泡沫,以额外摧毁C和B.

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

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

我不明白的是,当按下“OK”button以删除Df,Cf和Bf碎片时,如何在Df中执行操作?

我试图让碎片从堆栈中popup,但是这导致了一个exception。 onActivityResult是无用的,因为我没有使用startActivityForResult加载片段。

我是否完全错误地思考这个问题? 我是否应该实现某种与父代片段或活动进行通信的监听器,以便使用事务pipe理器来执行popup窗口?

我不明白的是,当按下“OK”button以删除Df,Cf和Bf碎片时,在Df中该怎么办?

步骤#1:有Df告诉D“哟!我们得到了确定的点击!” 通过调用方法,无论是在活动本身,还是由活动提供的接口实例。

步骤#2:通过FragmentManager删除FragmentManager

托pipe活动(D)是知道活动中有哪些其他片段(而不是在其他活动中)​​的活动。 因此,可能会影响片段组合的片段内事件应该传播到活动,这将使适当的编排stream动。

虽然它可能不是最好的方法,但我可以想到的最接近的作品是支持/兼容性库

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

要么

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

除此以外。

另外你可以使用backstack并popup它。 但请记住,片段可能不在堆栈上(取决于在那里得到它的fragmenttransaction ..)或者它可能不是最后一个进入堆栈,所以popup堆栈可以删除错误的…

你可以使用下面的方法,它工作正常:

 getActivity().getSupportFragmentManager().popBackStack(); 

你应该让Activity处理添加和删除碎片,就像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()); } }); } } 

在Activity / AppCompatActivity中:

 @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { // if you want to handle DrawerLayout mDrawerLayout.closeDrawer(GravityCompat.START); } else { if (getFragmentManager().getBackStackEntryCount() == 0) { super.onBackPressed(); } else { getFragmentManager().popBackStack(); } } } 

然后调用片段:

 getActivity().onBackPressed(); 

或者像其他答案中所述,在片段中调用它:

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

看看你的需求是否被DialogFragment满足。 DialogFragment有一个dismiss()方法。 我认为更清洁。

我为此创build了简单的方法

 popBackStack(getSupportFragmentManager()); 

比把它放在我的ActivityUtils类中

 public static void popBackStack(FragmentManager manager){ FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0); manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE); } 

这是伟大的工作,玩得开心!

如果您需要从后台堆栈历史logging中的第四个碎片回滚到第一个,请使用标签!

当你添加第一个片段时,应该使用如下所示的内容:

getFragmentManager.beginTransaction。 addToBackStack(“A”). add(R.id.container,FragmentA).commit()

要么

getFragmentManager.beginTransaction。 addToBackStack(“A”). replace(R.id.container,FragmentA).commit()

而当你想显示片段B,C和D你使用这个:

getFragmentManager.beginTransaction。 addToBackStack(“B”). replace(R.id.container,FragmentB,“B”)。commit()

和其他字母….

要返回到Fragment A,只需调用popBackStack(0,“A”) ,是的,请使用添加它时指定的标志,并注意它必须是addToBackStack命令中的同一个标志,而不是命令中使用的标志replace或添加。

别客气 ;)