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

Java安卓开发:如何在无关联类之间传递非静态变量

解决方案

你的传值链路逻辑搞反了,MyCanvas是挂载在SheetpageActivity上的自定义View,本身没有独立接收Intent的资格,正确传值链路是:MainActivity → 通过Intent传值给Sheetpage → Sheetpage拿到布局里的MyCanvas实例,把值传给它,不需要继承、不需要复杂的全局方案,三步就能实现。


具体实现步骤

1. 从MainActivity跳转时携带滑块值

在你触发跳转到第二页的逻辑里(比如跳转按钮点击、滑块选完确认的逻辑中),把三个滑块的值塞进Intent:

// 跳转到Sheetpage的代码段
Intent intent = new Intent(MainActivity.this, Sheetpage.class);
// 依次传入三个滑块的数值,key可以自己定义,只要两边对应就行
intent.putExtra("slider_val_1", slider1Variable);
intent.putExtra("slider_val_2", slider2Variable);
intent.putExtra("slider_val_3", slider3Variable);
startActivity(intent);

2. 修改MyCanvas类,增加对外传值的入口

给MyCanvas加内部变量存滑块值,加set方法接收外部传入的值,传值完成后自动触发重绘:

public class MyCanvas extends View{
    // 定义三个变量存储滑块值,给默认值避免初始化异常
    private int sliderVal1 = 1;
    private int sliderVal2 = 1;
    private int sliderVal3 = 1;

    public MyCanvas(Context context, AttributeSet attributeSet){
        super(context,attributeSet);
    }

    // 对外暴露的传值方法
    public void updateSliderParams(int val1, int val2, int val3){
        this.sliderVal1 = val1;
        this.sliderVal2 = val2;
        this.sliderVal3 = val3;
        // 必须调用invalidate触发画布重绘,新参数才会在绘图时生效
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 在这里写你的绘图逻辑,直接用上面三个sliderVal变量即可
    }
}

记得给你布局文件里引用的MyCanvas标签加个id,比如android:id="@+id/my_canvas_view",不然后面找不到实例。

3. 在Sheetpage中接收参数,传给MyCanvas

Sheetpage作为第二页的Activity,先接住Intent传过来的数值,再找到页面上的MyCanvas实例,把值传进去:

public class Sheetpage extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sheetpage); // 替换成你自己的第二页布局名

        // 从Intent中读取三个滑块值,读取失败时用默认值1
        int s1 = getIntent().getIntExtra("slider_val_1", 1);
        int s2 = getIntent().getIntExtra("slider_val_2", 1);
        int s3 = getIntent().getIntExtra("slider_val_3", 1);

        // 找到布局里实际渲染的MyCanvas实例,id要和你布局里加的一致
        MyCanvas canvasView = findViewById(R.id.my_canvas_view);
        // 调用我们写的更新方法,把值传进去
        canvasView.updateSliderParams(s1, s2, s3);
    }
}

你之前方案失效的原因

  • get/set方法不生效:你调用set方法的MyCanvas对象,和屏幕上实际显示的MyCanvas不是同一个实例。要么是自己new了一个新的MyCanvas对象设值,要么没有通过findViewById拿到布局加载的真实实例,修改的对象根本不在页面上,自然看不到效果。
  • Intent传给MyCanvas报错:Android中只有在Manifest注册的Activity组件才能接收Intent和跳转参数,自定义View是Activity内部的UI组成部分,没有独立接收Intent的能力,必须由所属Activity先接收参数再向内传递。
  • SharedPreferences方案本身可行,只是你大概率是存值后没有调用apply()/commit()提交,或者读值的时机不对,这个场景下用Intent传值是最轻量的选择,没必要用存储方案。
  • 不需要给两个类建立继承关系,View和Activity的职责完全不同,继承解决不了跨组件传值的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:27:19