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()方法中实现它们的特定代码。这是一个很好的解决方案,尽管我不确定这是一种干净的方法。但是很有效,谢谢;)