片段通过属性初始化从另一个继承

时间:2018-06-30 04:15:29

标签: android

public class CartMain extends BasicFragment implements EditMenuInterface {...}

public abstract class BasicFragment extends Fragment  {
    protected ArrayList<Integer> selectedElements = new ArrayList<>();
    protected RecyclerView listView;
    protected ObservableArrayList<?> list;
    protected boolean editMode = false;;
    protected View managementMenu

             ... methods...
}

我想在CartMain类的BasicFragments中初始化参数,但是由于我不能使用构造函数,所以我不知道如何正确地做到这一点。

我正在这样做:

CartMain Class
 @Override
public View onCreateView...{
mainView = inflater.inflate(R.layout.fragment_cart_main, container, false);
listView = view.findById...
list = cartDAO.getAll();
listView = mainView.findViewById(R.id.cart_list_itemCarts);

}

但是我不知道它是否正确,因为当我们使用构造函数时,它会强制性地初始化超类的属性,而使用onCreateView时它不会是易感性的。

1 个答案:

答案 0 :(得分:0)

关于片段的几点要点:

  1. 确保声明一个没有参数的空公共构造函数:

public CartMain(){}

没有该 public 空构造函数,如果将调用活动放在Pause上,并且一段时间后被垃圾回收,则Android将会崩溃。

Android将在主线程的onResume中寻找该空的公共构造函数以重新实例化您的片段。

  1. 如果应用在停止并垃圾回收后恢复工作,则在onCreateView中初始化的变量值将在onStart,onPause等之后用作默认值。不是变量,在类构造函数中。

因此,请在onCreateView中进行所有默认初始化。

您可以在超类的onCreateView中进行操作。

如果在超类中进行了一些初始化,则在子类中的onCreateView的开头添加super方法。

 @Override
 public View onCreateView(LayoutInflator li...{
      super(li... // This will call onCeateView in your super class
      ... // where you can initialize 'common-for-all' values, setup listeners
      ... 
      // do everything else

      return mainView;
 }
  1. 膨胀的onCreateView位置return mainView;的末尾。您返回的视图就是将出现在屏幕上的视图。

请勿通过onCreateView外部的构造函数使用初始化,因为如果由于应用程序暂停而被垃圾回收,则它将无法重新初始化。

要验证您的片段是否正常工作,请使用“开发人员”模式(使用以下设置:“限制-禁止后台进程,不将活动保留在内存中”或类似设置)。