在Android开发中经常会用到Fragment,为什么不建议直接给Fragment重载一个带参数的构造方法,然后使用带参数的构造方法来实例化Fragment?
首先要知道在某些情况下,Activity可能会重新创建你已经实例化的Fragment,在重新创建时,它会使用Fragment无参数的构造方法来进行实例化,如果之前是通过带参数的构造方法创建的Fragment,那么重新创建的Fragment就无法得到这些参数,从而导致某些状态出现错误。
如果需要在创建Fragment时传入参数,我们可以通过setArguments方法,把参数封装在Bundle中。比如说有一个ListFragment,实例化时需要传入一个参数userId,我们可以定义一个静态方法newInstance如下。
public static ListFragment newInstance(long userId) {
ListFragment fragment = new ListFragment();
Bundle args = new Bundle();
args.putLong("userId", userId);
fragment.setArguments(args);
return fragment;
}
然后在ListFragment的onCreate方法中通过getArguments来获取传入的参数。
Bundle args = getArguments();
long userId = args.getLong("userId");
这样的好处是即使Activity重新创建Fragment时,这个Bundle仍然保留,新的Fragment实例还可以通过getArguments获取到之前传入的参数。
内容