如何通过单个按钮实现TextView多次文本切换?请排查代码问题
问题分析与解决方案
首先看你代码里最致命的几个问题:
多余的分号直接废掉了for循环逻辑:你写的
for (i=1;i<28;i++);后面多了个分号,这个分号会让for循环的执行体变成空语句——循环会直接把i从1一口气加到28,之后才会进入后面的switch。这时候i已经是28了,匹配不到任何case,只会走default,所以点击按钮完全没效果。逻辑和需求完全不匹配:你的需求是每次点击按钮切换一次文本,但你用了一个一次性跑完的for循环,这完全没必要。你应该在每次点击按钮时,让
i自增(或者循环回到初始值),然后根据当前的i值切换对应内容。代码语法不完整:你的switch语句没有闭合,缺少
},而且setOnClickListener的匿名内部类也没写完,缺少}和);,这会直接导致编译错误。
修正后的代码示例
下面是调整后的代码,完美实现每次点击按钮切换文本,到最后一个状态后还能循环回到初始值:
public class Second extends AppCompatActivity { TextView tv; Button btn; int i; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second2); tv = findViewById(R.id.tv); btn = findViewById(R.id.btn); i = 1; tv.setText(R.string.s1); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 每次点击让i自增,超过最大case值后重置为1,实现循环切换 i++; if (i > 7) { i = 1; } switch (i){ case 1: // 恢复TextView默认样式(因为case7修改了背景和尺寸) tv.setBackgroundResource(android.R.color.transparent); // 替换成你原来的背景资源 tv.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); tv.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); tv.setText(R.string.s1); break; case 2: tv.setText(R.string.s2); break; case 3: tv.setText(R.string.s3); break; case 4: tv.setText(R.string.s4); break; case 5: tv.setText(R.string.s5); break; case 6: tv.setText(R.string.s6); break; case 7: tv.setBackgroundResource(R.drawable.tigs); tv.setHeight(430); tv.setWidth(350); tv.setText(R.string.s6_1); break; default: break; } } }); } }
额外说明
- 我在case 1里加了恢复TextView背景和尺寸的代码——因为case7修改了这些属性,如果你切换回前面的case,需要把这些属性还原,否则会一直保持case7的样式。
- 去掉了
findViewById的强制类型转换,Android API 26及以上版本,findViewById会自动返回对应类型的控件,不需要强转。 - 每次点击按钮时
i自增,超过最大case值(7)后重置为1,这样就能循环切换文本了。
内容的提问来源于stack exchange,提问作者ded-logoped
相关产品推荐
相关产品推荐

