我不知道如何以正确的方式做到这一点。我有一个主/细节流程,现在我在需要完成它的细节中执行一个操作,但是当然,细节片段应该不知道它是否由单个或双个窗格活动包装。如何在主/细节流程中完成碎片?
那么我应该怎么做?我正在考虑这两个活动都会执行的回调,并且单个窗格将自行完成并因此完成碎片,而双窗格只会弹出碎片。
这是个好主意吗?从细节片段回调?没有这么多的开销?
由于
我不知道如何以正确的方式做到这一点。我有一个主/细节流程,现在我在需要完成它的细节中执行一个操作,但是当然,细节片段应该不知道它是否由单个或双个窗格活动包装。如何在主/细节流程中完成碎片?
那么我应该怎么做?我正在考虑这两个活动都会执行的回调,并且单个窗格将自行完成并因此完成碎片,而双窗格只会弹出碎片。
这是个好主意吗?从细节片段回调?没有这么多的开销?
由于
现在我在需要完成它
即用于主/细图案异常流量细节执行动作。通常,细节一直存在,直到用户点击主列表中的其他内容。尽管如此,我可以看到您提议的流程在正在查看的项目上进行删除操作。
我在考虑一个回调,两个活动都会执行,单个窗格会自己完成它,因此完成碎片,双窗格只会弹出碎片。
这是一个很好的答案。
这不是很多开销吗?
编号定义一个接口,承载片段的所有活动都必须实现。您可以考虑使用合同模式,以帮助强制执行:
import android.app.Activity;
import com.actionbarsherlock.app.SherlockFragment;
// from https://gist.github.com/2621173
public abstract class ContractFragment<T> extends SherlockFragment {
private T mContract;
@SuppressWarnings("unchecked")
@Override
public void onAttach(Activity activity) {
try {
mContract=(T)activity;
}
catch (ClassCastException e) {
throw new IllegalStateException(activity.getClass()
.getSimpleName()
+ " does not implement "
+ getClass().getSimpleName()
+ "'s contract interface.", e);
}
super.onAttach(activity);
}
@Override
public void onDetach() {
super.onDetach();
mContract=null;
}
public final T getContract() {
return mContract;
}
}
(基于ActionBarSherlock成名a gist from Jake Wharton代码)
这里,T
是接口的名称。您的片段将继承此并调用getContract()
来检索您称之为回调方法的接口实现对象。运行时间的开销最多只能达到几十条指令 - 无需担心。
我正在考虑在列表中添加/编辑动作,这会将表单片段放到详细信息片段所在的位置,所以当您提交表单时,它会自行终止并返回到正常的细节片段(平板电脑)。从细节片段中删除也是如此。正如M-WaJeEh提出的那样,我只是不知道是否使用回调来实现它,所以包装活动控制片段,或者只是一个if语句片段来确定谁在托管我。 – urSus 2013-02-21 16:32:00
@VlastoBennyLava:嗯,你的计划是有道理的。就我个人而言,我更喜欢让我的片段不知道托管活动,而'instanceof'方法需要片段了解特定的活动类。因此,我更喜欢我的答案中概述的界面方法。尽管如此,两者都有效。 – CommonsWare 2013-02-21 16:34:19
关于另一个话题,你能否看看我的另一个问题? http://stackoverflow.com/questions/14990269/where-to-handle-cab-actions-of-a-list-item-that-are-common-with-detail。谢谢。 – urSus 2013-02-21 16:39:17
不是它的开销。这是正确的方式。
或做到这一点在你的DetailFragment
:
if (getActivity() instanseOf SinglePaneActivity){
getActivity().finish();
}else{
getActivity().getFragmentManager().popBackStack();
}
这不是多少开销? - >我不这么认为。如果你抽象回调它可以重用其他片段。我也相信这是解决您的问题的有效建议。片段为开发人员带来了灵活性(不仅仅是活动),而且您将拥有代码而不是活动来处理所有用例。 – Tobrun 2013-02-21 15:46:06
不是它的开销。这是正确的方式。如果你不想实现那个接口,那么就这么做'如果getActivity()实例化SinglePaneActivity'然后'getActivity()。finish();'else'getActivity()。getFragmentManager()。popMyFragment();'。 – 2013-02-21 15:46:42