如何在Master / Detail流程中完成片段?

时间:2013-02-21 15:42:54

标签: android android-fragments master-detail activity-finish

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

那我该怎么做呢?我正在考虑一个回调,两个活动都会实现,单个窗格只是自己完成它,因此完成片段,双窗格就会弹出片段。

这是个好主意吗?从细节片段回调?这不是开销吗?

由于

2 个答案:

答案 0 :(得分:5)

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

DetailFragment

中执行此操作
if (getActivity() instanseOf SinglePaneActivity){
    getActivity().finish(); 
}else{ 
    getActivity().getFragmentManager().popBackStack();
}

答案 1 :(得分: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()来检索接口实现对象,您可以在其上调用您的回调方法。运行时间开销最多只需几十条指令 - 您无需担心。