- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Parcelable 接口(interface)将我的对象传递到 fragment 中。根据 Android 的文档,它是一个“类的接口(interface),其实例可以写入 Parcel 并从中恢复”[1] .
我期待每次当 ParcelableObject 通过 Bundle 传递到另一个 fragment 时,对象被写入 Parcel 然后 Parcelable.CREATOR 应该重新创建对象并初始化对象的变量。
如果我将我的可打包对象 (X) 放入 Bundle 并将该包设置为我的新 fragment 的参数,这对我来说有点意外。然后我在新 fragment 的 onCreateView 方法中从 bundle 中读取我的 parcelable 对象 (Y)。我在 onCreateView (Y) 中获得的对象与我在前一个 fragment 中放入 Bundle 的对象 (X) 相同(意思是 X == Y)。更令人惊讶的是,Parcelable.CREATOR 甚至没有被调用。
他们在 Android 的文档中写到 Bundle:“从 String 值到各种 Parcelable 类型的映射。” [2] .好吧,这也许可以解释为什么写入的对象与读取的对象相同,但为什么他们需要 Parcelable.CREATOR 接口(interface),即使没有它也能正常工作?
现在让我们更具体一点:
我有一个 ParentPagerFragment
,它包含一个 ViewPager,它是 3 个 ChildTextViewFragment
的父级
这里是 ParentPagerFragment
实现的重要部分。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_pager, container, false);
List<ChildTextViewFragment> viewFragments = new ArrayList<>();
MyEntity mEntity1 = new MyEntity();
mEntity1.setId(1l);
MyEntity mEntity2 = new MyEntity();
mEntity2.setId(2l);
MyEntity mEntity3 = new MyEntity();
mEntity3.setId(3l);
viewFragments.add(ChildTextViewFragment.newInstance(mEntity1));
viewFragments.add(ChildTextViewFragment.newInstance(mEntity2));
viewFragments.add(ChildTextViewFragment.newInstance(mEntity3));
MyPagerAdapter mPagerAdapter = new MyPagerAdapter(getChildFragmentManager(), viewFragments);
ViewPager mViewPager = (ViewPager) v.findViewById(R.id.pager);
mViewPager.setAdapter(mPagerAdapter);
return v;
}
ChildTextViewFragment
只显示一个简单的TextView
ChildTextViewFragment::newInstance 实现
public static ChildTextViewFragment newInstance(MyEntity mEntity) {
ChildTextViewFragment fragment = new ChildTextViewFragment();
Bundle bundle = new Bundle();
Log.d(MyEntityParcelable.TAG, "ChildTextViewFragment::newInstance : creating Parcelable : mEntity has ID = "+ mEntity.getId() +" mEntity = " + mEntity);
MyEntityParcelable entityPar = new MyEntityParcelable(mEntity);
bundle.putParcelable(M_ENTITY_KEY, entityPar);
fragment.setArguments(bundle);
return fragment;
}
ChildTextViewFragment::onCreateView 实现
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_text, container, false);
TextView mTextView = (TextView) view.findViewById(R.id.textView1);
MyEntityParcelable mEntityPar = getArguments().getParcelable(M_ENTITY_KEY);
MyEntity mEntity = mEntityPar.getMyEntity();
Log.d(MyEntityParcelable.TAG, "ChildTextViewFragment::onCreateView : reading Parcelable : mEntity has ID = "+mEntity.getId()+" mEntity = " + mEntity);
mTextView.setText("my id is: " + Long.toString(mEntity.getId()));
return view;
}
我的实体:
public class MyEntity {
private long id;
private String name;
private String description;
private String owner;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
}
MyEntityParcelable
public class MyEntityParcelable implements Parcelable {
public static final String TAG = "PARCELABLE_TESTING";
private MyEntity myEntity;
public MyEntityParcelable(MyEntity mEntity) {
this.myEntity = mEntity;
}
private MyEntityParcelable(Parcel in) {
Log.d(TAG, "MyEntityParcelable::Parcel constructor : creating MyEntity from Parcel");
myEntity = new MyEntity();
myEntity.setId(in.readLong());
myEntity.setName(in.readString());
myEntity.setDescription(in.readString());
myEntity.setOwner(in.readString());
}
@Override
public int describeContents() {
return this.hashCode();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
Log.d(TAG, "MyEntityParcelable::writeToParcel : writing myEntity with ID = " + myEntity.getId() + " to Parcel");
dest.writeLong(myEntity.getId());
dest.writeString(myEntity.getName());
dest.writeString(myEntity.getDescription());
dest.writeString(myEntity.getOwner());
}
/*
* Parcelable interface must also have a static field called CREATOR, which
* is an object implementing the Parcelable.Creator interface. Used to
* un-marshal or de-serialize object from Parcel.
*/
public static final Parcelable.Creator<MyEntityParcelable> CREATOR = new Parcelable.Creator<MyEntityParcelable>() {
public MyEntityParcelable createFromParcel(Parcel in) {
return new MyEntityParcelable(in);
}
public MyEntityParcelable[] newArray(int size) {
return new MyEntityParcelable[size];
}
};
public MyEntity getMyEntity() {
return myEntity;
}
}
正如我上面提到的,甚至没有调用 PARCELABLE.CREATOR,这里是演示控制流的日志。
13:55:14.946: ChildTextViewFragment::newInstance : creating Parcelable : mEntity has ID = 1 mEntity = com.example.nestedfragments.MyEntity@21208247
13:55:14.951: ChildTextViewFragment::newInstance : creating Parcelable : mEntity has ID = 2 mEntity = com.example.nestedfragments.MyEntity@1ecfc4f8
13:55:14.952: ChildTextViewFragment::newInstance : creating Parcelable : mEntity has ID = 3 mEntity = com.example.nestedfragments.MyEntity@3c4a9dd1
13:55:15.069: ChildTextViewFragment::onCreateView : reading Parcelable : mEntity has ID = 1 mEntity = com.example.nestedfragments.MyEntity@21208247
13:55:15.071: ChildTextViewFragment::onCreateView : reading Parcelable : mEntity has ID = 2 mEntity = com.example.nestedfragments.MyEntity@1ecfc4f8
13:55:33.614: ChildTextViewFragment::onCreateView : reading Parcelable : mEntity has ID = 3 mEntity = com.example.nestedfragments.MyEntity@3c4a9dd1
请注意对象标识在创建和读取时是相同的。
这是在 fragment 之间传递对象的正确方法吗?在哪些情况下调用 Parcelable.CREATOR 接口(interface)?
谢谢你的帮助!
最佳答案
So ok that's maybe what explains why is the written object identical with the read one, but why they need the Parcelable.CREATOR interface when it works as correct even without it ?
您的 Parcelable
未放入 Parcel
中,因此未使用 Parcelable.CREATOR
。
Parcel
涉及IPC。因此,如果您尝试通过 startActivity()
额外传递相同的 Intent
,那将涉及您的 CREATOR
,如 startActivity()
涉及IPC。
配置更改可能涉及包裹
(他们可能会优化这种情况)。如果您的进程在后台终止,并且用户通过最近任务列表快速返回到您正在运行的任务,这将涉及一个 Parcel
和一个 CREATOR
。
关于android - Parcelable 接口(interface)保留对象引用? &Parcelable.CREATOR 是不是叫了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31115368/
此处,“OK”当然意味着 AYOR(风险由您自己承担),但如果避免与现有属性名称发生明显冲突,则不会出现可预见的问题。 Skyfield物体——尤其是行星——通常具有有限数量的属性。我经常编写简短的脚
我们有一个(假设)将在 1-2 年内完成的项目。到那时,JDK7(希望还有 Java7 JCP 规范)应该准备就绪。 但是,我想知道,甲骨文做出“愚蠢”决定的“危险”有多大,这会使 JDK7 成为一个
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
要知道,haswell是英特尔作为Ivy Bridge微架构的“第四代核心”继承者而开发的一种处理器微架构的代号。 1英特尔正式发布了基于这种微架构的CPU... More 但是,我想知道如何通过在
修改 setter 参数是否正常?假设我们有 setString 方法。我们真的想保留字符串的修剪形式。所以带有尾随空格的字符串是无效的,但我们不想抛出异常。 最好的解决办法是什么?修剪 setter
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。 Improve this
我写了一段代码,然后编译它没有错误。但是当我运行时,它会引发异常(java.lang.NoClassDefFoundError: TesKt$test$1$1)。 这是语言错误吗? private f
这道题是从算法导论的习题23.1-7演化而来的。 原问题是: 23.1-7争论如果一个图的所有边权重都是正的,那么连接所有顶点并且具有最小总权重的边的任何子集必须是一棵树。举例说明,如果我们允许某些权
假设我创建了一个 lambda 实例,稍后我想查询该对象以查看它是 proc 还是 lambda。如何做到这一点? .class() 方法不起作用。 irb(main):001:0> k = lamb
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
所以我正在将我的一个程序移植到一个新的游戏机上。问题是用于编译我的 c++ 应用程序的 SDK 不支持 __int16,但它支持 int16_t。使用 int16_t 代替 __int16 是否“安全
我最近偷看了 Url.IsLocalUrl() 方法的实现,该方法被广泛使用并被推荐为用于防止重定向攻击的措施之一。我惊讶地发现,如果我要为我的应用程序中的 Controller 的其中一个操作提供完
我读了这篇好文章 Angular onPush Change Detection Strategy 在某个时候他写道: It’s an anti-pattern to expose your subj
我是这样理解的: Innodb 中的缓冲池:它存储来自 Sql 表的索引和数据并缓存它以供将来查询,因此它不需要一直打扰 Mysql。 Memcached:用于存储从 Innodb 接收到的数据并对其
以防万一 vector 为空,(意外,异常(exception)情况) cppreference 在 vector::back() 上说: Calling back on an empty conta
我是一名优秀的程序员,十分优秀!