You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio按钮点击时向Cart Activity传递数据问题

解决Android Studio购物车数据传递与持久化问题

刚接触Android开发遇到这种问题很正常,咱们一步步来搞定它——既要实现点击按钮传递商品数据到Cart页面,还要能保存多件商品不会丢失。

第一步:用Parcelable封装商品数据

直接传零散的字符串、图片ID太麻烦,咱们先定义一个Product实体类,把商品名称、价格、图片信息都封装进去,同时实现Parcelable接口(Android用来跨页面传递对象的标准方式):

import android.os.Parcel;
import android.os.Parcelable;

public class Product implements Parcelable {
    private String name;
    private String price;
    private int imageResId; // 存应用内图片资源ID,网络图的话换成String存URL

    // 构造方法
    public Product(String name, String price, int imageResId) {
        this.name = name;
        this.price = price;
        this.imageResId = imageResId;
    }

    // Parcelable序列化/反序列化方法,Android Studio可以自动生成(右键→Generate→Parcelable)
    protected Product(Parcel in) {
        name = in.readString();
        price = in.readString();
        imageResId = in.readInt();
    }

    public static final Creator<Product> CREATOR = new Creator<Product>() {
        @Override
        public Product createFromParcel(Parcel in) {
            return new Product(in);
        }

        @Override
        public Product[] newArray(int size) {
            return new Product[size];
        }
    };

    // Getter方法,供后续页面获取数据
    public String getName() { return name; }
    public String getPrice() { return price; }
    public int getImageResId() { return imageResId; }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(price);
        dest.writeInt(imageResId);
    }
}

第二步:按钮点击时传递商品数据

修改你原有的按钮点击代码,获取TextView里的内容和图片资源,封装成Product对象后通过Intent传递:

Button button = findViewById(R.id.addcart);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 获取商品名称、价格
        String productName = ((TextView) findViewById(R.id.textView6)).getText().toString();
        String productPrice = ((TextView) findViewById(R.id.textView7)).getText().toString();
        // 获取商品图片资源ID(假设图片在ImageView中,ID为product_image)
        int productImage = ((ImageView) findViewById(R.id.product_image)).getDrawable().getConstantState().getResourceId();
        
        // 创建商品对象
        Product newProduct = new Product(productName, productPrice, productImage);
        
        // 跳转并传递数据
        Intent intent = new Intent(当前Activity.this, CartActivity.class);
        intent.putExtra("NEW_PRODUCT", newProduct);
        startActivity(intent);
    }
});

第三步:Cart页面接收并保存商品数据

之前你只能传单次数据,是因为没做持久化存储。咱们用SharedPreferences结合Gson来保存购物车列表(新手友好,不用复杂数据库):

  1. 先在build.gradle(Module)里添加Gson依赖:
dependencies {
    // 其他依赖...
    implementation 'com.google.code.gson:gson:2.10.1'
}
  1. CartActivity的核心代码:
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;

public class CartActivity extends AppCompatActivity {
    private ArrayList<Product> cartList;
    private SharedPreferences sp;
    private Gson gson = new Gson();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);

        // 初始化SharedPreferences,用来持久化保存购物车数据
        sp = getSharedPreferences("CartData", MODE_PRIVATE);
        // 读取已保存的购物车列表
        loadCartData();

        // 接收新传递过来的商品
        Product newProduct = getIntent().getParcelableExtra("NEW_PRODUCT");
        if (newProduct != null) {
            cartList.add(newProduct);
            // 保存更新后的购物车
            saveCartData();
        }

        // 这里可以用RecyclerView/ListView展示cartList里的商品
        // 比如给RecyclerView设置适配器,把cartList传进去即可
    }

    // 读取已保存的购物车数据
    private void loadCartData() {
        String cartJson = sp.getString("cart_list", "");
        if (!cartJson.isEmpty()) {
            Type type = new TypeToken<ArrayList<Product>>() {}.getType();
            cartList = gson.fromJson(cartJson, type);
        } else {
            cartList = new ArrayList<>();
        }
    }

    // 保存购物车数据到SharedPreferences
    private void saveCartData() {
        String cartJson = gson.toJson(cartList);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("cart_list", cartJson);
        editor.apply();
    }
}

补充说明

  • 如果是网络图片:把Product里的imageResId换成imageUrl(String类型),传递后在Cart页面用Glide/Picasso加载即可。
  • 进阶方案:如果后续购物车逻辑复杂(比如修改数量、删除商品),建议换成Room数据库,比SharedPreferences更适合处理结构化数据。

内容的提问来源于stack exchange,提问作者Tanner Tattini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:02:06