我有两个片段,MyFirst片段和MySecond片段。 MySecond片段从MyFirst片段扩展。
分类是这样的:
public class MyFirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
...
// Check view and map, request to recreate if each of them is null
if(MyFirstFragment.this.getView() == null || googleMap == null) {
Toast.makeText(getActivity().getApplicationContext(), R.string.my_message, Toast.LENGTH_LONG).show();
return;
}
}
}
public class MySecondFragment extends MyFirstFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
...
}
}
我的问题是MySecondFragment的onActivityCreated()方法中的super.onActivityCreated(savedInstanceState);
调用它的超级。因为我想在超类中隐藏这个方法的功能(这对这个片段没用)我在MySecondFragment中添加了onActivityCreated()方法。
问题是,如果我删除此行,那么我有运行时错误,抛出“SuperNotCalledException”。
你怎么想?似乎我必须扩展Fragment类而不是扩展MyFirstFragment。 我在MyFirstFragment中有一些变量,我需要它们在MySecondFragment中。答案 0 :(得分:2)
无论如何,您都需要调用Fragment的实现。如果您不想调用MyFirstFragment的实现,可以使用以下几种解决方案:
最干净的一个,给MyFirstFragment和MySecondFragment一个共同的祖先,除了onActivityCreated()之外,它几乎是MyFirstFragment。这两项活动都将直接从中继承。
调用super,但是向bundle添加一个变量让MyFirstFragment知道这次不会调用它的实现。
只需在MySecondFragment中扩展片段
答案 1 :(得分:2)
您可以在testFunction(Bundle savedInstanceState)
中编写一个新功能MyFirstFragment
来拨打super.onActivityCreated(savedInstanceState);
在MySecondFragment
的{{1}}调用此onActivityCreated
而不是testFunction(Bundle savedInstanceState)
即。
super.onActivityCreated(savedInstanceState);
中的
MyFirstFragment
testFunction(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
}
中的
MySecondFragment
我不明白你绕过public void onActivityCreated(Bundle savedInstanceState) {
super.testFunction(savedInstanceState);
...
}
MyFirstFragment
的基本要求,但你可以这样做。
答案 2 :(得分:-1)
你应该总是调用super方法。只需在MySecondFragment.onActivityCreated()方法中设置所需的变量,然后再使用它们。要隐藏功能,您始终可以检查调用对象类,但这违反了OOP继承原则。