我不知道如何以正确的方式做到这一点。我有一个主/细节流程,现在我在细节中执行需要完成它的动作,但当然,细节片段应该不知道它是由单个或双窗格活动包裹的。
那我该怎么做呢?我正在考虑一个回调,两个活动都会实现,单个窗格只是自己完成它,因此完成片段,双窗格就会弹出片段。
这是个好主意吗?从细节片段回调?这不是开销吗?
由于
答案 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()
来检索接口实现对象,您可以在其上调用您的回调方法。运行时间开销最多只需几十条指令 - 您无需担心。