为什么我不能导入字符串数组,因为日志中有一个错误“java.util.ArrayList无法强制转换为java.lang.CharSequence”

问题描述 投票:0回答:3

我试图设置一个按钮,使用一个数组(像基于文本的冒险游戏的概念)显示对话框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

java android classcastexception
3个回答
1
投票

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(", "));

0
投票

试试这可能会有所帮助

index++; btn_message.setText(messages [index].toString()); 

0
投票

如果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++]);
    }
}

}

© www.soinside.com 2019 - 2024. All rights reserved.