- 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/
我正在尝试在我的代码库中为我正在编写的游戏服务器更多地使用接口(interface),并了解高级概念以及何时应该使用接口(interface)(我认为)。在我的例子中,我使用它们将我的包相互分离,并使
我有一个名为 Widget 的接口(interface),它在我的整个项目中都在使用。但是,它也用作名为 Widget 的组件的 Prop 。 处理此问题的最佳方法是什么?我应该更改我的 Widget
有一个接口(interface)可以是多个接口(interface)之一 interface a {x:string} interface b {y:string} interface c {z:st
我遇到了一种情况,我需要调用第三方服务来获取一些信息。这些服务对于不同的客户可能会有所不同。我的界面中有一个身份验证功能,如下所示。 interface IServiceProvider { bool
在我的例子中,“RequestHandlerProxy”是一个结构,其字段为接口(interface)“IAdapter”,接口(interface)有可能被调用的方法,该方法的输入为结构“Reque
我有一个接口(interface)Interface1,它已由类A实现,并且设置了一些私有(private)变量值,并且我将类A的对象发送到下一个接受输入作为Interface2的类。那么我怎样才能将
假设我有这样的类和接口(interface)结构: interface IService {} interface IEmailService : IService { Task SendAs
有人知道我在哪里可以找到 XML-RPC 接口(interface)的定义(在 OpenERP 7 中)?我想知道创建或获取对象需要哪些参数和对象属性。每个元素的 XML 示例也将非常有帮助。 最佳答
最近,我一直在阅读有关接口(interface)是抽象的错误概念的文章。一篇这样的帖子是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
如果我有一个由第三方实现的现有 IInterface 后代,并且我想添加辅助例程,Delphi 是否提供了任何简单的方法来实现此目的,而无需手动重定向每个接口(interface)方法?也就是说,给定
我正在尝试将 Article 数组分配给我的 Mongoose 文档,但 Typescript 似乎不喜欢这样,我不知道为什么它显示此警告/错误,表明它不可分配. 我的 Mongoose 模式和接口(
我有两个接口(interface): public interface IController { void doSomething(IEntity thing); } public inte
是否可以创建一个扩展 Serializable 接口(interface)的接口(interface)? 如果是,那么扩展接口(interface)的行为是否会像 Serilizable 接口(int
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func 并根据 s
我正在处理一个要求,其中我收到一个 JSON 对象,其中包含一个日期值作为字符串。我的任务是将 Date 对象存储在数据库中。 这种东西: {"start_date": "2019-05-29", "
我们的方法的目标是为我们现有的 DAO 和模型类引入接口(interface)。模型类由各种类型的资源 ID 标识,资源 ID 不仅仅是随机数,还带有语义和行为。因此,我们必须用对象而不是原始类型来表
Collection 接口(interface)有多个方法。 List 接口(interface)扩展了 Collection 接口(interface)。它声明与 Collection 接口(int
我有一个 Java 服务器应用程序,它使用 Jackson 使用反射 API 对 DTO 进行一般序列化。例如对于这个 DTO 接口(interface): package com.acme.libr
如果我在 Kotlin 中有一个接口(interface): interface KotlinInterface { val id: String } 我可以这样实现: class MyCla
我知道Java中所有访问修饰符之间的区别。然而,有人问了我一个非常有趣的问题,我很难找到答案:Java 中的 private 接口(interface)和 public 接口(interface)有什
我是一名优秀的程序员,十分优秀!