Android,Super没有调用异常错误

时间:2013-07-23 08:43:35

标签: android android-fragments

我有两个片段,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中。

3 个答案:

答案 0 :(得分:2)

无论如何,您都需要调用Fragment的实现。如果您不想调用MyFirstFragment的实现,可以使用以下几种解决方案:

  1. 最干净的一个,给MyFirstFragment和MySecondFragment一个共同的祖先,除了onActivityCreated()之外,它几乎是MyFirstFragment。这两项活动都将直接从中继承。

  2. 调用super,但是向bundle添加一个变量让MyFirstFragment知道这次不会调用它的实现。

  3. 只需在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继承原则。