- 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/
我正在尝试使用 XmlPullParser 解析 XML 文档,但出现以下错误 Gradle:错误:找不到符号类 newInstance 创建 XmlPullParserFactory XmlPull
在 Java 中,当存在拒绝访问检查抑制的 SecurityManager 时,Constructor 的 newInstance 方法起作用,而 Class 的 newInstance 抛出 Sec
最近我开始尝试一点反射(reflection)。我遇到了一个找不到任何答案的问题。我会尽力解释问题所在。 首先,我有一个从带有注释的反射中获得的方法。当我尝试调用这个方法时,我当然需要它所在类的一个实
我将从我的示例开始:我有一个类 classload.Loadable 。 package classload; public class Loadable { static{
你好 V8 程序员和 node-gyp'ers。我正在运行 OS X 10.12.6、Node v6.11.1 和 npm v3.10.10、nan v2.6.2,gcc 作为 XCode 的一部分,
我目前正在为自己编写一个私有(private) Java API,它使用 Class允许扩展 API 的特定部分(统计数据保存部分)而不改变底层用法。我喜欢这种方法,但由于某种原因,每当 API 尝试
这个问题已经有答案了: Akka. Android. NoSuchMethodException: (2 个回答) 已关闭 6 年前。 我觉得我错过了一些东西。我正在尝试做下一步: Class.fo
以下代码返回 null: private JComponent setupComponent(Class c, Object... constructor) { try {
我正在尝试了解如何使用 Api.camera2我正在关注此链接中的谷歌样本 https://github.com/googlesamples/android-Camera2Basic 当我打开项目时,
我有一个抽象 fragment 类(称为 A)和一个扩展它的 fragment 类(称为 B)。我目前在制作 B 类的对象时调用 newInstance,但我想知道我如何也可以为 A 类做类似的事情,
我正在从 bignerdranch 学习 android 开发,我正在尝试实现寻呼机适配器,但在 Android Studio 中出现无法解析 newInstance 方法的错误。我在每个类中使用支持
我一直在研究一种实例化方法,它允许我将各种相似的类打包到一个外部类中。然后我可以通过将该类型的名称传递给构造函数来实例化每个唯一的类类型。经过大量的研究和错误,这就是我想出的。我留下了一个错误,以证明
调用 newInstance() 是否有惩罚,或者它下面的机制是否相同?newInstance() 对 new 关键字* 有多少开销(如果有的话)? *:忽略 newInstance() 意味着使用反
这个问题在这里已经有了答案: Instantiate a class object with constructor that accepts a string parameter? (4 个回答)
我正在处理一个解析 xml 文件的项目,我在使用 SAXParserFactory 和 DocumentBuilderFactory 时遇到了问题。对于他们两个,当我尝试调用 newInstance(
我编写了在打印之前将文档转换为字符串的代码 TransformerFactory tf = TransformerFactory.newInstance(); Tran
我在进行重构时遇到了这种情况,所以我想知道它们之间是否存在任何差异? 例如: import java.util.List; import java.lang.reflect.Array; public
我通过 bean 脚本框架使用 rhino 在我的 java 进程中创建和配置对象。脚本中使用的一些类需要动态加载,因为它们并不总是位于标准类路径上。 为了加载这些类,我使用自定义类加载器初始化脚本框
我正在编写一个有两个 ArrayList 的类字段。一种是用于包含自定义对象。另一个用于包含自定义集合对象(也可能具有这些字段): private ArrayList myObjList;
我需要从一种类型转换为另一种类型。谷歌搜索但卡住了。假设我想将 initObject 转换为 Casted 类。 Object objInstance = initObject.getClass().
我是一名优秀的程序员,十分优秀!