初始化扩展Fragment时如何停止要调用的父Fragment的onActivityCreated?

时间:2019-05-07 14:58:20

标签: java android android-fragments

基本上,我从其他片段创建了新的Fragment by Extended,因为我只想覆盖某些方法,但仍会继续使用其中的很多方法。

原始片段

public class RestaurantListFragment extends BaseFragment {
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d(TAG, " :Original :onActivityCreated");
    }
}

扩展片段。

public class RestaurantByFoodListFragment extends RestaurantListFragment {
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Log.d(TAG, " :Modify :onActivityCreated");
    }
}

所以当我像这样从PagerAdapter调用扩展片段时

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
            case 1:
                Log.d(TAG, " :getItem");
                restaurantByFoodListFragment = new RestaurantByFoodListFragment();
                restaurantByFoodListFragment.setFoodId(this.foodId);
                return restaurantByFoodListFragment;
            default:
                return null;
        }
    }

两个片段中的onActivityCreated似乎都被调用了(我只希望扩展对象调用)

这是我的日志。

Res List Fragment:  :Original :onActivityCreated
Res By Food Fragment:  :Modify :onActivityCreated
Res List Fragment:  :Original :onActivityCreated
Res By Food Fragment:  :Modify :onActivityCreated

那么这可能仅在扩展片段(onActivityCreated)内触发RestaurantByFoodListFragment而没有触发原始片段(RestaurantListFragment)吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以通过如下更改类来解决此问题:

public class RestaurantListFragment extends BaseFragment {
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        onActivityCreatedInternal();
    }

    protected void onActivityCreatedInternal() {
        Log.d(TAG, " :Original :onActivityCreated");
    }
}
public class RestaurantByFoodListFragment extends RestaurantListFragment {
    @Override
    protected void onActivityCreatedInternal() {
        Log.d(TAG, " :Modify :onActivityCreated");
    }
}

您在这里所做的工作是将onActivityCreated()委托给新方法onActivityCreatedInternal(),在子类中您调用super.onActivityCreatedInternal()

这将使您既可以(a)满足所有Fragment子类都调用super.onActivityCreated()的要求,又可以(b)通过覆盖被覆盖的方法来完全覆盖行为“内部” onActivityCreated()讨论给。