创build一个片段:构造函数vs newInstance()

我最近厌倦了不断地需要知道String键来创build我的Fragments时将参数传入Bundles 。 所以我决定为我的Fragments创build构造函数,这些构造函数将采用我想要设置的参数,并使用正确的String键将这些variables放入Bundles ,因此不需要其他FragmentsActivities需要知道这些键。

 public ImageRotatorFragment() { super(); Log.v(TAG, "ImageRotatorFragment()"); } public ImageRotatorFragment(int imageResourceId) { Log.v(TAG, "ImageRotatorFragment(int imageResourceId)"); // Get arguments passed in, if any Bundle args = getArguments(); if (args == null) { args = new Bundle(); } // Add parameters to the argument bundle args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId); setArguments(args); } 

然后我像正常一样提出这些论点。

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.v(TAG, "onCreate"); // Set incoming parameters Bundle args = getArguments(); if (args != null) { mImageResourceId = args.getInt(KEY_ARG_IMAGE_RES_ID, StaticData.getImageIds()[0]); } else { // Default image resource to the first image mImageResourceId = StaticData.getImageIds()[0]; } } 

然而,林特对此表示@SuppressLint("ValidFragment") ,说没有带有其他参数的构造函数的Fragment子类,要求我使用@SuppressLint("ValidFragment")来运行应用程序。 事情是,这段代码工作得很好。 我可以使用ImageRotatorFragment(int imageResourceId)或旧的方法ImageRotatorFragment()并手动调用setArguments() 。 当Android需要重新创build片段(方向更改或内存不足)时,它将调用ImageRotatorFragment()构造函数,然后使用我的值传递相同的参数Bundle ,并将其正确设置。

所以我一直在寻找“build议”的方法,并看到了很多使用newInstance()来创build具有参数的Fragments的例子,这似乎是我的构造函数做同样的事情。 所以我做了我自己的testing,它的工作和以前一样完美无瑕,减去了Lint对它的呜呜声。

 public static ImageRotatorFragment newInstance(int imageResourceId) { Log.v(TAG, "newInstance(int imageResourceId)"); ImageRotatorFragment imageRotatorFragment = new ImageRotatorFragment(); // Get arguments passed in, if any Bundle args = imageRotatorFragment.getArguments(); if (args == null) { args = new Bundle(); } // Add parameters to the argument bundle args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId); imageRotatorFragment.setArguments(args); return imageRotatorFragment; } 

我个人发现,使用构造函数比知道使用newInstance()和传递参数更为普遍。 我相信你可以使用这个相同的构造函数与活动和林特不会抱怨它。 所以基本上我的问题是,为什么Google不希望你使用带有Fragments参数的构造函数?

我唯一的猜测是,所以你不要试图设置一个实例variables,而不使用Bundle ,当Fragment被重新创build时它不会被设置。 通过使用static newInstance()方法,编译器不会让你访问一个实例variables。

 public ImageRotatorFragment(int imageResourceId) { Log.v(TAG, "ImageRotatorFragment(int imageResourceId)"); mImageResourceId = imageResourceId; } 

我仍然不觉得这是足够的理由不允许在构造函数中使用参数。 任何人都有这方面的见解?

我个人发现,使用构造函数比知道使用newInstance()和传递参数更为普遍。

工厂方法模式在现代软件开发中被相当频繁地使用。

所以基本上我的问题是,为什么Google不希望你使用带有Fragments参数的构造函数?

你是在自问自答:

我唯一的猜测是,所以你不要试图设置一个实例variables,而不使用Bundle,当Fragment被重新创build时它不会被设置。

正确。

我仍然不觉得这是足够的理由不允许在构造函数中使用参数。

欢迎您提出意见。 欢迎您以每个构造函数或每个工作区的方式禁用此Lint检查。

Android只使用默认的构造函数来重新创build它所杀死的碎片,所以我们在其他构造函数中所做的任何初始化都将丢失。因此,数据将会丢失。