如何将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
相关产品推荐
相关产品推荐

