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

如何将MainActivity中的数组数据传递给自定义View类BarActivity

核心问题

你混淆了Android中Activity和自定义View的概念:

  • 你命名为BarActivity的类实际继承的是View,只有继承Activity/AppCompatActivity的类才能调用getIntent()获取跳转携带的数据
  • 用Intent跳转的目标必须是Activity类,不能是View类,否则会直接报错

解决步骤

1. 重命名自定义View,避免混淆

把你现有的继承View的BarActivity类改名为BarChartView,删掉里面和Intent相关的无效代码,新增接收数据的公开方法:

public class BarChartView extends View  {
    Map<String, Float> data = new HashMap<>();
    private float barWidth = 60f;
    private float barSpace = 20f;
    private Paint mPaint;

    public BarChartView(Context context, AttributeSet attrs) throws URISyntaxException {
        super(context, attrs);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    }

    // 新增接收外部数据的方法
    public void setChartData(String[] grades, Integer[] values) {
        data.clear();
        if(grades != null && values != null && grades.length == values.length) {
            // 可根据你的需求自定义数值转换逻辑
            for (int i = 0; i < grades.length; i++) {
                data.put(grades[i], values[i] / 100f);
            }
        }
        // 触发View重绘
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 直接用data内的数值绘制柱状图即可
    }
}

2. 新建真正的BarActivity(继承AppCompatActivity)

先创建BarActivity的布局文件activity_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- 引入自定义柱状图View,com.yourpackage替换为你自己的包路径 -->
    <com.yourpackage.BarChartView
        android:id="@+id/barChartView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

再写BarActivity的业务代码

public class BarActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bar);
        BarChartView barChartView = findViewById(R.id.barChartView);
        
        // 获取Intent传递的两个数组
        String[] grades = getIntent().getStringArrayExtra("Grades");
        Integer[] values = getIntent().getIntArrayExtra("Values");
        
        // 将数据传递给自定义柱状图View
        barChartView.setChartData(grades, values);
    }
}

3. 修改MainActivity的跳转逻辑

你原有代码两个触发点分别跳转只传单个数组,建议先把两组数据存为全局变量,跳转时一起传递:

public class MainActivity extends AppCompatActivity {
    EditText editText;
    ListView listView;
    ListAdapter listAdapter;
    Button btnCompute;
    // 全局变量存储两组数据
    String[] gradesArr;
    Integer[] valuesArr;

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

        editText=findViewById(R.id.edittext);
        listView=findViewById(R.id.listView);
        btnCompute=findViewById(R.id.btnCompute);

        editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    try {
                        if(editText.getText().toString().isEmpty()) {
                            listAdapter=null;
                            listView.setAdapter(null);
                            gradesArr = null;
                        } else {
                            gradesArr =editText.getText().toString().split(",");
                            listAdapter=new ListAdapter(MainActivity.this, gradesArr);
                            listView.setAdapter(listAdapter);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return true;
                }
                return false;
            }
        });

        btnCompute.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(listAdapter!=null && gradesArr != null) {
                    valuesArr=listAdapter.getList();
                    Intent intent = new Intent(MainActivity.this,BarActivity.class);
                    // 同时传递两个数组
                    intent.putExtra("Grades", gradesArr);
                    intent.putExtra("Values", valuesArr);
                    startActivity(intent);
                }
            }
        });
    }
}

最后注意

别忘了在AndroidManifest.xml中注册你新建的BarActivity,否则跳转时会抛出找不到Activity的异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:24:05