- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我最近厌倦了在创建 Fragments
时不断地必须知道 String
键才能将参数传递到 Bundles
。所以我决定为我的 Fragments
制作构造函数,它将接受我想要设置的参数,并将这些变量放入具有正确 String
的 Bundles
> 键,因此无需其他需要知道这些键的 Fragments
和 Activity
。
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];
}
}
但是,Lint 对此提出了质疑,说不具有带有其他参数的构造函数的 Fragment
子类,要求我使用 @SuppressLint("ValidFragment")
来甚至运行应用程序。问题是,这段代码工作得很好。我可以使用 ImageRotatorFragment(int imageResourceId)
或老式方法 ImageRotatorFragment()
并手动调用 setArguments()
。当 Android 需要重新创建 Fragment(方向改变或内存不足)时,它会调用 ImageRotatorFragment()
构造函数,然后将相同的参数 Bundle
与我的值一起传递,这些值被设置正确。
所以我一直在寻找“建议”的方法,并看到很多使用 newInstance()
来创建带有参数的 Fragments
的示例,这似乎是一样的我的构造函数是什么。所以我自己做了一个测试,它和以前一样完美无瑕,除了 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()
和传递参数要普遍得多。我相信您可以在 Activity 中使用相同的构造函数技术,并且 Lint 不会提示它。 所以基本上我的问题是,为什么 Google 不希望您为 Fragments
使用带参数的构造函数?
我唯一的猜测是你不要尝试在不使用 Bundle
的情况下设置实例变量,当重新创建 Fragment
时不会设置实例变量。通过使用 static newInstance()
方法,编译器不会让您访问实例变量。
public ImageRotatorFragment(int imageResourceId) {
Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");
mImageResourceId = imageResourceId;
}
我仍然觉得这不足以成为禁止在构造函数中使用参数的充分理由。其他人对此有见解吗?
最佳答案
I personally find that using constructors is a much more common practice than knowing to use newInstance() and passing parameters.
factory method pattern在现代软件开发中相当频繁地使用。
So basically my question is, why does Google not want you to use constructors with parameters for Fragments?
您回答了自己的问题:
My only guess is so you don't try to set an instance variable without using the Bundle, which won't get set when the Fragment gets recreated.
正确。
I still don't feel like this is enough reason to disallow the use of parameters in constructors.
欢迎您发表意见。欢迎您在每个构造函数或每个工作空间的方式上禁用此 Lint 检查。
关于android - 创建 fragment : constructor vs newInstance(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14654766/
我想在我的单元测试中模拟一个遗留对象。这是构造函数: public Class LegacyClass{ public LegacyClass(Object... obj) {
此处说明https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function函数对象实例的构造函数属性“指定创建对
有没有办法从子类中的构造函数分配在父类(super class)中声明的实例变量?我已经习惯使用 BUILD() 作为构造函数,但我想知道这是否是个好主意。 IE: use v6; clas
鉴于以下情况: type AStruct struct { m_Map map[int]bool } 在这种情况下,AStruct的实例在AStruct.m_Map初始化之前不能使用: m_M
我是 Android 新手,我正在尝试学习如何使用 Gson 解析 API 调用。我已经阅读了一些内容,我正在尝试遵循这个示例:http://www.javacodegeeks.com/2011/01
我正在阅读 this文章,我不知道下面这行是做什么的。即使我删除了这一行,我也看不出有什么不同。 this.constructor.prototype.constructor.apply(this,A
这个问题已经有答案了: JsonMappingException: No suitable constructor found for type [simple type, class ]: can
我正在处理我的第一个 Flutter 项目,我正在构建一个登录页面,我创建了一个变量来存储一个 TextFormFieldController,但我收到了上面的错误,因为我删除了构造函数。当我返回这个
假设我们有以下主要和次要构造函数: open class Animal(val name:String){ internal constructor(message:InputStream): t
为什么默认复制构造函数不调用 monster 的基构造函数,但是当我在 troll 中包含一个用户定义的复制构造函数时,它会调用父级(即: 怪物) 构造函数? 我认为它的工作原理如下:创建基础对象,然
这个问题在这里已经有了答案: Is there a difference between foo(void) and foo() in C++ or C? (4 个答案) 关闭 8 年前。 我注意到
我将 T4MVC 与 MVC2 一起使用。 我有以下构建 block : 一个简单的实体接口(interface),它定义了每个 POCO 实体必须有一个 long Id属性(property): p
以下代码返回一个错误: “构造函数调用必须是构造函数中的第一个语句。” 我不明白。我的代码中的构造函数是第一条语句。我究竟做错了什么? public class labelsAndIcons exte
我是 kotlin 的新手,对它包含的所有有用的语法糖和功能感到惊讶。 但是每当我声明一个构造函数时,我都必须独立地将我的所有字段设为私有(private)。 class Result(private
作为主题,相关代码为: #include class ABC { public: ABC() { std::cout<< "default con
在 Haxe 中,我创建了一个名为 的类。我的类 喜欢: class MyClass { var score: String; public function new (score:
不确定为什么会这样,尝试删除所有 new 实例,从 const ect 切换到 let。可以运行站点,但是当我通过 html 表单运行发布请求时,在“const user = new UserSche
我是 Javascript 的新手,我正在尝试深入挖掘并理解继承、构造函数和原型(prototype)链。所以,我创建了一个构造函数, var a = function(){this.integer=
我知道 JavaScript 中的函数有双重生命,第一个是函数(作为创建实例的第一类事物),第二个是普通对象。 但是我很惊讶地看到下面控制台的输出。 function A() { consol
这个问题在这里已经有了答案: Why can't I access a property of an integer with a single dot? (5 个答案) 关闭 5 年前。 为什么
我是一名优秀的程序员,十分优秀!