Android:TextView仅显示最后一个getIntent().getStringExtra()内容?
没问题,当然可以实现!你的核心需求其实是根据Spinner选中的不同选项,在InfoActivity的单个TextView里显示对应的数据(新内容覆盖旧的),现在代码里的问题主要是传值和接收的逻辑没理顺,咱们一步步来改:
第一步:修正MainActivity的传值逻辑
你现在的代码里,第一个if分支犯了个小错误:startActivity(intent.putExtra("rabit_syno",rabitSyno)); 这里重复调用了putExtra,而且其实每个分支只需要传递当前选中项对应的数据就行,没必要一次性传三个(因为每次启动InfoActivity时,用户只选了一个选项)。更高效的方式是用同一个Key来传递不同的内容,这样接收的时候更简洁:
protected void setGoBtn(){ String rabitSyno = getString(R.string.rabit_syno); String lifeSyno = getString(R.string.life_syno); String poolSyno = getString(R.string.pool_syno); goBtn = (Button) findViewById(R.id.goBtn); goBtn.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ Intent intent = new Intent(v.getContext(), Info.class); // 根据选中项传递对应的数据,用统一的key switch(selectedItem()){ case 1: intent.putExtra("selected_content", rabitSyno); break; case 2: intent.putExtra("selected_content", lifeSyno); break; case 3: intent.putExtra("selected_content", poolSyno); break; default: // 可选:如果选中无效项,传递默认提示 intent.putExtra("selected_content", "请选择有效选项"); } startActivity(intent); } }); }
这样每次启动InfoActivity时,Intent里只会带当前选中项对应的内容,用同一个keyselected_content,接收的时候就不用判断三个不同的key了。
第二步:简化InfoActivity的接收逻辑
你之前的循环逻辑会导致最后一次setText覆盖前面的内容,因为循环会把三个值都设置一遍,最后一个自然会显示出来。现在咱们只需要读取那个统一的key的值,直接设置给TextView就行:
private void displaySelectedContent(){ // 读取Intent里的内容,第二个参数是默认值(如果没有拿到数据时显示) String content = getIntent().getStringExtra("selected_content"); if(content != null){ displayTxt.setText(content); } else { displayTxt.setText("暂无内容"); } }
然后在InfoActivity的onCreate方法里调用这个方法就行,比如:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_info); displayTxt = (TextView) findViewById(R.id.displayTxt); displaySelectedContent(); }
为什么原来的代码会只显示最后一个内容?
你原来的InfoActivity里的循环,会依次执行displayTxt.setText(txtBox[0])、setText(txtBox[1])、setText(txtBox[2]),而TextView的内容会被每次的setText覆盖,所以最后一次设置的txtBox[2]就会留在界面上。而且实际上,每次启动InfoActivity时,Intent里只有一个Extra(比如选中1的时候只有rabit_syno,其他两个都是null),所以循环里的txt1和txt2其实都是null,这样设置还会导致显示空内容的问题。
额外小建议
- 可以把Intent的key定义成常量,比如在InfoActivity里定义
public static final String EXTRA_SELECTED_CONTENT = "selected_content";,这样MainActivity里直接用Info.EXTRA_SELECTED_CONTENT,避免拼写错误。 - 如果以后需要传递多个数据,也可以用
Bundle来封装,比如:
接收的时候用Bundle bundle = new Bundle(); bundle.putString("key1", value1); bundle.putString("key2", value2); intent.putExtras(bundle);getIntent().getExtras().getString("key1"),不过你的场景用单个key就足够啦。
内容的提问来源于stack exchange,提问作者Kira Nofans

