【问题标题】:How to pass ParcelableArrayList from Fragment to Fragment?如何将 Parcelable ArrayList 从 Fragment 传递到 Fragment?
【发布时间】:2020-05-26 03:02:47
【问题描述】:

我一直在尝试找到将 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 值,我可以毫无问题地接收它。

然后,这是我接收数据的第二个片段(ParcelableArrayListint 值):

 @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;
    }

由于某种原因,当我到达这一点时,List 是空的,我得到的唯一值是 this.getArguments().getInt("position");(int 值)

最后这是我的 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];
        }
    };
}

我错过了什么的任何线索?

【问题讨论】:

    标签: java android android-fragments parcelable android-bundle


    【解决方案1】:

    在 kotlin 中尝试了相同的方法,Cards.java 完好无损。名单通过。这是sn-p。 可以试试对比一下吗?

    以第一个片段为例:

    val item = Cards("gfhfhfhfh", "", "", "", "")
    val list = ArrayList<Cards>()
    list.add(item
    

    将其传递为:(无显式转换)

    bundle.putParcelableArrayList("list",list)
    

    在下一个片段中:

    val l = arguments?.getParcelableArrayList<Cards>("list")
    

    【讨论】:

      【解决方案2】:

      根据这篇文章,How to marshall and unmarshall ParcelableParcelable 对象不稳定,这很可能是您无法将它从一个活动传递到另一个活动的原因。我最近遇到了类似的问题并使用相同的帖子来解决我的问题。基本上分步骤: 1.您需要将第一个Activity中的Parcelable对象编组为:

      byte[] bytes = marshall(parcelableObj);
      
      intentOpenSecondActivity.putExtra(SOME_KEY, bytes);
      

      2。您需要在第二个 Activity 中将其解组为:

      byte[] bytes = getIntent().getExtras().getByteArray(SOME_KEY);
      
      parcelableObj = unmarshall(bytes, ParcelableObject.CREATOR);
      

      【讨论】:

        猜你喜欢
        • 2021-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-16
        • 1970-01-01
        • 2019-02-09
        相关资源
        最近更新 更多