【发布时间】:2017-02-19 12:09:30
【问题描述】:
这应该是一个简单的问题,但由于某种原因,我遇到了麻烦。假设我有一个 FragmentOne 和 FragmentTwo。 FragmentOne 看起来像这样:
private static final String PATH_KEY = "path_key";
private Asset asset;
public FragmentOne() {
// Required empty public constructor
}
public static FragmentOne newInstance(Asset asset) {
FragmentOne fragment = new FragmentOne();
Bundle args = new Bundle();
args.putSerializable(PATH_KEY, asset);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
asset = (Asset) getArguments().getSerializable(PATH_KEY);
}
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
final FragmentOneBinding binding = DataBindingUtil
.inflate(inflater, R.layout.fragment_video, container, false);
bindAsset(binding, asset);
return binding.getRoot();
}
public void bindAsset(FragmentOneBinding binding, Asset asset) {
binding.textView.setText("FragOne displays asset like this " + asset.text);
//this is the only method which differs from FragmentTwo
}
而 FragmentTwo 看起来像这样:
private static final String PATH_KEY = "path_key";
private Asset asset;
public FragmentTwo() {
// Required empty public constructor
}
public static FragmentTwo newInstance(Asset asset) {
FragmentTwo fragment = new FragmentTwo();
Bundle args = new Bundle();
args.putSerializable(PATH_KEY, asset);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
asset = (Asset) getArguments().getSerializable(PATH_KEY);
}
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
final FragmentTwoBinding binding = DataBindingUtil
.inflate(inflater, R.layout.fragment_video, container, false);
bindAsset(binding, asset);
return binding.getRoot();
}
public void bindAsset(FragmentOneBinding binding, Asset asset) {
binding.textView.setText("But FragTwo, which is very different, displays asset like this " + asset.image.getName());
//this is the only method which differs from FragmentOne
}
如您所见,在两个片段中,newInstance、onCreate 和 onCreateView 方法在结构上是相同的。唯一真正的区别是两个片段的onCreateView内部调用的bindView方法不一样。
使用泛型、抽象类、接口或某种组合,我可以将事情简化为模板设计模式吗?这样下次我想制作具有完全相同结构的片段时,我可以做一些这样的事情吗?
class FragmentThree extends TemplateFragment {
@Override
public void bindAsset(FragmentThreeBinding binding, Asset asset){
binding.textView.setText(asset.name);
}
}
我已经尝试过创建一个抽象类,但是抽象类中不能有静态方法,所以 newInstance() 在这里阻止了我。我也尝试了几种实现接口的方法,但没有任何运气。
【问题讨论】:
标签: java android android-fragments design-patterns data-binding