2013-02-21 24 views
0

我不知道如何以正确的方式做到这一点。我有一个主/细节流程,现在我在需要完成它的细节中执行一个操作,但是当然,细节片段应该不知道它是否由单个或双个窗格活动包装。如何在主/细节流程中完成碎片?

那么我应该怎么做?我正在考虑这两个活动都会执行的回调,并且单个窗格将自行完成并因此完成碎片,而双窗格只会弹出碎片。

这是个好主意吗?从细节片段回调?没有这么多的开销?

由于

+0

这不是多少开销? - >我不这么认为。如果你抽象回调它可以重用其他片段。我也相信这是解决您的问题的有效建议。片段为开发人员带来了灵活性(不仅仅是活动),而且您将拥有代码而不是活动来处理所有用例。 – Tobrun 2013-02-21 15:46:06

+0

不是它的开销。这是正确的方式。如果你不想实现那个接口,那么就这么做'如果getActivity()实例化SinglePaneActivity'然后'getActivity()。finish();'else'getActivity()。getFragmentManager()。popMyFragment();'。 – 2013-02-21 15:46:42

回答

2

现在我在需要完成它

即用于主/细图案异常流量细节执行动作。通常,细节一直存在,直到用户点击主列表中的其他内容。尽管如此,我可以看到您提议的流程在正在查看的项目上进行删除操作。

我在考虑一个回调,两个活动都会执行,单个窗格会自己完成它,因此完成碎片,双窗格只会弹出碎片。

这是一个很好的答案。

这不是很多开销吗?

编号定义一个接口,承载片段的所有活动都必须实现。您可以考虑使用合同模式,以帮助强制执行:

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()来检索您称之为回调方法的接口实现对象。运行时间的开销最多只能达到几十条指令 - 无需担心。

+0

我正在考虑在列表中添加/编辑动作,这会将表单片段放到详细信息片段所在的位置,所以当您提交表单时,它会自行终止并返回到正常的细节片段(平板电脑)。从细节片段中删除也是如此。正如M-WaJeEh提出的那样,我只是不知道是否使用回调来实现它,所以包装活动控制片段,或者只是一个if语句片段来确定谁在托管我。 – urSus 2013-02-21 16:32:00

+1

@VlastoBennyLava:嗯,你的计划是有道理的。就我个人而言,我更喜欢让我的片段不知道托管活动,而'instanceof'方法需要片段了解特定的活动类。因此,我更喜欢我的答案中概述的界面方法。尽管如此,两者都有效。 – CommonsWare 2013-02-21 16:34:19

+0

关于另一个话题,你能否看看我的另一个问题? 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

5

不是它的开销。这是正确的方式。

做到这一点在你的DetailFragment

if (getActivity() instanseOf SinglePaneActivity){ 
    getActivity().finish(); 
}else{ 
    getActivity().getFragmentManager().popBackStack(); 
}