java - 如何将 ParcelableArrayList 从 Fragment 传递到 Fragment?
问题描述
我一直在尝试找到将 ParcelableArrayList 从一个 Fragment 传递到另一个 Fragment 的方法,并且由于某种原因,当我收到 ParcelableArrayList 时它是空的。我已经检查了很多关于这个问题的帖子,但我没有让它工作。
这是我在 FrameLayout 中保存片段的 Activity:
package com.blumonpay.restaurant.customer.presentation.activities;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import android.os.Bundle;
import android.view.WindowManager;
import com.blumonpay.android.mifel.restaurante.R;
import com.blumonpay.restaurant.customer.presentation.fragments.ShowPayMethodsFragment;
public class PayMethodsActivity extends AppCompatActivity {
private Fragment showFragment;
private Fragment addFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
setContentView(R.layout.activity_pay_methods);
showFragment = ShowPayMethodsFragment.getInstance(this);
getSupportFragmentManager()
.beginTransaction()
.add(R.id.frameLayout, showFragment)
.commit();
}
public void switchFragment(Fragment fragment) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.frameLayout, fragment)
.commit();
}
}
这就是我试图在我的第一个片段中传递 ArrayList 的方式:
Bundle dataBundle = new Bundle();
dataBundle.putParcelableArrayList("cardsList", (ArrayList<? extends Parcelable>) list);
dataBundle.putInt("position",position);
ShowDetailedPayMethodFragment showDetailPayMethod = ShowDetailedPayMethodFragment.getInstance(context);
showDetailPayMethod.setArguments(dataBundle);
((PayMethodsActivity)context).switchFragment(showDetailPayMethod);
如您所见,我还传递了一个int
我可以毫无问题地接收的值。
然后,这是我接收数据(ParcelableArrayList
和int
值)的第二个片段:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_view_detailed_pay_method, container, false);
if (this.getArguments()!=null) {
cardsList = this.getArguments().getParcelableArrayList("cardsList");
positionList = this.getArguments().getInt("position");
}
cardsBannerAdapter = new CustomCardsBannerAdapter(context, cardsList);
cardsViewPager.setAdapter(cardsBannerAdapter);
initSlider();
return v;
}
由于某种原因,当我到达这一点时,列表是空的,我得到的唯一值是this.getArguments().getInt("position");
(int value)
最后这是我的 POJO 课程Cards
:
package com.blumonpay.restaurant.customer.domain.model;
import android.os.Parcel;
import android.os.Parcelable;
public class Cards implements Parcelable {
private String cardNumber;
private String cardType;
private String cardBrand;
private String cardExpirationDate;
private String cardHolderName;
public Cards(String cardNumber, String cardType, String cardBrand, String cardExpirationDate, String cardHolderName) {
this.cardNumber = cardNumber;
this.cardType = cardType;
this.cardBrand = cardBrand;
this.cardExpirationDate = cardExpirationDate;
this.cardHolderName = cardHolderName;
}
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getCardType() {
return cardType;
}
public void setCardType(String cardType) {
this.cardType = cardType;
}
public String getCardBrand() {
return cardBrand;
}
public void setCardBrand(String cardBrand) {
this.cardBrand = cardBrand;
}
public String getCardExpirationDate() {
return cardExpirationDate;
}
public void setCardExpirationDate(String cardExpirationDate) {
this.cardExpirationDate = cardExpirationDate;
}
public String getCardHolderName() {
return cardHolderName;
}
public void setCardHolderName(String cardHolderName) {
this.cardHolderName = cardHolderName;
}
protected Cards(Parcel in) {
cardNumber = in.readString();
cardType = in.readString();
cardBrand = in.readString();
cardExpirationDate = in.readString();
cardHolderName = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(cardNumber);
dest.writeString(cardType);
dest.writeString(cardBrand);
dest.writeString(cardExpirationDate);
dest.writeString(cardHolderName);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<Cards> CREATOR = new Parcelable.Creator<Cards>() {
@Override
public Cards createFromParcel(Parcel in) {
return new Cards(in);
}
@Override
public Cards[] newArray(int size) {
return new Cards[size];
}
};
}
我错过了什么的任何线索?
解决方案
根据这篇文章,如何编组和解组 Parcelable,Parcelable
对象不稳定,这很可能是您无法将其从一项活动传递到另一项活动的原因。我最近遇到了类似的问题并使用相同的帖子来解决我的问题。基本上按步骤: 1.您需要将Parcelable
第一个对象编组Activity
为:
byte[] bytes = marshall(parcelableObj);
intentOpenSecondActivity.putExtra(SOME_KEY, bytes);
2.您需要在第二个中将其解组Activity
为:
byte[] bytes = getIntent().getExtras().getByteArray(SOME_KEY);
parcelableObj = unmarshall(bytes, ParcelableObject.CREATOR);
推荐阅读
- javascript - 在获取不重新渲染后反应 setState()
- angularjs - POST 请求未映射到 Spring MVC 控制器
- shopify - 如何在 Shopify 上实施 Schema.org 标记?
- webpack - 如何使用 Webpack 加载字体
- rethinkdb - 使用 Rethinkdb 访问嵌套字段
- websphere - Websphere 仅在服务器启动时创建转储
- angularjs - ng-repeat 中的指令范围问题
- autosar - COM AUTOSAR 模块的信号过滤
- javascript - MVC - 通过 ajax 将 js 变量传递给控制器,然后在视图中使用它
- ios - Wowza 直播问题