我不知道如何以正确的方式做到这一点。我有一个主/详细信息流,现在我在需要完成它的详细信息中执行一个操作,但是当然,详细信息片段应该不知道它是由单窗格活动还是双窗格活动包裹。
那么我该怎么做呢?我正在考虑两个活动都将实现的回调,并且单个窗格将自行完成并因此完成片段,而双窗格只会弹出片段。
这是一个好主意吗?有来自细节片段的回调?这不是很多开销吗?
谢谢
我不知道如何以正确的方式做到这一点。我有一个主/详细信息流,现在我在需要完成它的详细信息中执行一个操作,但是当然,详细信息片段应该不知道它是由单窗格活动还是双窗格活动包裹。
那么我该怎么做呢?我正在考虑两个活动都将实现的回调,并且单个窗格将自行完成并因此完成片段,而双窗格只会弹出片段。
这是一个好主意吗?有来自细节片段的回调?这不是很多开销吗?
谢谢
不,它不是开销。这是正确的方式。
或者在你的DetailFragment
:
if (getActivity() instanseOf SinglePaneActivity){
getActivity().finish();
}else{
getActivity().getFragmentManager().popBackStack();
}
现在我在需要完成它的细节中执行一个动作
对于主/细节模式来说,这是不寻常的流程。通常,细节会一直存在,直到用户点击主列表中的其他内容。不过,我可以看到您建议的对正在查看的项目进行删除操作的流程。
我正在考虑两个活动都将实现的回调,并且单个窗格将自行完成并因此完成片段,而双窗格只会弹出片段。
这是一个很好的答案。
这不是很多开销吗?
不。定义一个接口,托管您的片段的所有活动都必须实现。您可以考虑使用契约模式来帮助强制执行:
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()
以检索您调用回调方法的接口实现对象。运行时开销最多只有几十条指令——您无需担心。