如何得到一个片段去除自己,即完成()相当于?
我正在转换应用程序使用兼容性库使用片段。 现在我有一些活动(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或添加。
别客气 ;)