我试图设置一个按钮,使用一个数组(像基于文本的冒险游戏的概念)显示对话框onClick
的下一行,但是当我导入.xml时,这只是一个存储所有对话框的简单。
package com.example.project;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn_message;
String[] messages;
int index = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Importing values
messages = getResources().getStringArray(R.array.messages);
btn_message=findViewById(R.id.btn_message);
//set Value to varibles
btn_message.setOnClickListener(this);
}
@Override
public void onClick(View v) {
index++;
btn_message.setText(messages [index]);
}
}
如果需要Logcat:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.CharSequence
at com.example.project.MainActivity.onClick(MainActivity.java:34)
at android.view.View.performClick(View.java:6256)
at android.view.View$PerformClick.run(View.java:24701)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
string.xml
<resources>
<string-array name="messages">
<item>test1</item>
<item>test2</item>
<item>test3</item>
<item>test4</item>
<item>test5</item>
<item>test6</item>
<item>test7</item>
<item>test8</item>
</string-array>
</resources>
布局:activity_main.xml中
<Button
android:id="@+id/btn_message"
android:layout_width="713dp"
android:layout_height="146dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
预计单击按钮并按钮上的文本更改,但应用程序崩溃的原因是:
java.util.ArrayList无法强制转换为java.lang.CharSequence
Button#setText()
方法接收一个String,它是CharSequence的一个实现,当你执行messages[index]
时,你得到一个ArrayList,它包含一个元素中行的每个单元格,所以是一个数组数组。
你应该用一个字符串收集它们。如果列表是List<String>
,一种方法是:
String stringMessage = String.join(", ", messages[index]);
然后你应该能够毫无例外地制作setText()
cal:
@Override
public void onClick(View v) {
index++;
String stringMessage = String.join(", ", messages[index]);
btn_message.setText(stringMessage);
}
像这样你将加入昏迷和空间,
,如果你想以其他方式加入它们,只需在#join()
的第一个参数中指定另一个连接字符串
如果ArrayList不是String,则可以使用lambdas执行相同的操作:
String messageString = messages[index].stream().map(Object::toString)
.collect(Collectors.joining(", "));
试试这可能会有所帮助
index++; btn_message.setText(messages [index].toString());
如果onClick避免超出范围异常,你可以按照条件进行操作
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn_message;
String[] messages;
int index = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
messages = getResources().getStringArray(R.array.messages);
btn_message=findViewById(R.id.btn_message);
//set Value to varibles
btn_message.setText(messages[index++]);
btn_message.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(index < messages.length) {
btn_message.setText(messages[index]);
index++;
}else{
index = 0;
btn_message.setText(messages[index++]);
}
}
}