3

我有两个片段,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);
        ...
        }
    }

我的问题在于super.onActivityCreated(savedInstanceState);MySecondFragment 的 onActivityCreated() 方法调用它的超级。因为我想在超类中隐藏这个方法的功能(这对这个片段没有用),所以我在 MySecondFragment 中添加了 onActivityCreated() 方法。

问题是,如果我删除了这一行,那么我会遇到抛出“SuperNotCalledException”的运行时错误。

你认为呢?似乎我必须扩展 Fragment 类而不是扩展 MyFirstFragment。我在 MyFirstFragment 中有一些变量,我在 MySecondFragment 中需要它们。

4

3 回答 3

2

testFunction(Bundle savedInstanceState)您可以MyFirstFragment在其中调用中编写一个新函数super.onActivityCreated(savedInstanceState);

在你MySecondFragmentonActivityCreated电话中,testFunction(Bundle savedInstanceState)而不是super.onActivityCreated(savedInstanceState); ie

MyFirstFragment

testFunction(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);
}

MySecondFragment

public void onActivityCreated(Bundle savedInstanceState) {
    super.testFunction(savedInstanceState);
...
}

我不清楚您绕过MyFirstFragment's的基本要求,onActivityCreated但您可以这样做。

于 2013-07-23T09:24:02.243 回答
2

无论如何,您都需要调用 Fragment 的实现。如果您不想调用 MyFirstFragment 的实现,有几个解决方案:

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

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

  3. 只需在 MySecondFragment 中扩展 Fragment

于 2013-07-23T09:07:33.403 回答
-1

你应该总是调用 super 方法。只需在 MySecondFragment.onActivityCreated() 方法中设置您需要的变量,然后使用它们。要隐藏功能,您始终可以检查调用对象类,但这违反了 OOP 继承原则。

于 2013-07-23T09:02:22.177 回答