Android,超级不调用异常错误
我有两个片段,我的第一个片段和第二个片段。我的第二个片段从我的第一个片段扩展而来 分类如下:Android,超级不调用异常错误,android,android-fragments,Android,Android Fragments,我有两个片段,我的第一个片段和第二个片段。我的第二个片段从我的第一个片段扩展而来 分类如下: public class MyFirstFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ...
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);
...
}
}
我的问题是super.onActivityCreated(savedInstanceState)调用其超级函数。因为我想在超类中隐藏这个方法的功能(这对这个片段不有用),所以我在MySecondFragment中添加了一个activityCreated()方法
问题是,如果我删除这一行,那么我就有运行时错误抛出“SuperNotCalledException”
你怎么想?似乎我必须扩展Fragment类而不是扩展MyFirstFragment。
我在MyFirstFragment中有一些变量,我需要它们在MySecondFragment中。您应该始终调用super方法。只需在MySecondFragment.onActivityCreated()方法中设置所需的变量,然后使用它们。要隐藏功能,您可以始终检查调用对象类,但这违反了OOP继承原则。您需要调用片段的实现。如果您不想调用MyFirstFragment的实现,有几种解决方案:
最干净的一个方法是,给MyFirstFragment和MySecondFragment一个共同的祖先,除了onActivityCreated()之外,它将与MyFirstFragment几乎相同。这两个活动都将直接从中继承
调用super,但向bundle添加一个变量,让MyFirstFragment知道这次不调用它的实现
只需在MySecondFragment中扩展片段
您可以在MyFirstFragment
中编写一个新函数testFunction(Bundle savedInstanceState)
,其中调用super.onActivityCreated(savedInstanceState)代码>
在您的MySecondFragment
的onActivityCreated
中,调用此testFunction(Bundle savedInstanceState)
而不是super.onActivityCreated(savedInstanceState)代码>
i、 e
在MyFirstFragment
testFunction(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.testFunction(savedInstanceState);
...
}
在MySecondFragment
testFunction(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.testFunction(savedInstanceState);
...
}
我不清楚您的基本要求是绕过创建的活动上的MyFirstFragment
,但您可以这样做。我不明白您为什么要删除该行?他想把功能隐藏在父片段中。请尝试删除从MySecondFragment创建的ActivityCreated上的整个方法。@Caner,正如您可以看到的,super方法中有一条Toast消息。然后显示在不应显示的第二个片段中。该Toast消息属于第一个片段,而不是第二个片段。Debug。在SecondFragment的onActivityCreated中放置一个断点,100%确保它命中该行如果重写,则需要调用super()。对于您来说,super()来自第一个片段。你为什么不期待祝酒词呢?但它叫超级。第二个片段调用super.onActivityCreated,这是第一个片段的onActivityCreated,它反过来也调用super.onActivityCreated,这会上升到片段。据我所知,OP不想调用super.onActivityCreated(),因为有些代码不应该为MySecondFragment.onActivityCreated()运行。因此,他要么只需要在调用对象的类是MyFirstFragment时运行代码,要么正如mick88所指出的,最好的解决方案是让MyFirstFragment和MySecondFragment都继承一个公共抽象祖先,该祖先在其onActivityCreated()中具有公共代码子类应该在其onActivityCreated()方法中实现它们的特定代码。这是一个很好的解决方案,尽管我不确定这是一种干净的方法。但是很有效,谢谢;)