0

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

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

这是一个好主意吗?有来自细节片段的回调?这不是很多开销吗?

谢谢

4

2 回答 2

5

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

或者在你的DetailFragment

if (getActivity() instanseOf SinglePaneActivity){
    getActivity().finish(); 
}else{ 
    getActivity().getFragmentManager().popBackStack();
}
于 2013-02-21T15:53:00.130 回答
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的 Jake Wharton 的要点)

这里,T是接口的名称。您的片段将从 this 继承并调用getContract()以检索您调用回调方法的接口实现对象。运行时开销最多只有几十条指令——您无需担心。

于 2013-02-21T15:50:40.147 回答