Почему я не могу импортировать строковый массив, так как в журнале есть ошибка, которая говорит, что «java.util.ArrayList не может быть приведен к java.lang.CharSequence» - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь установить кнопку, которая отображает следующую строку диалога 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

Ответы [ 3 ]

1 голос
/ 08 апреля 2019

Метод 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);
    }

Likeпри этом вы объедините их с комой и пробелом ,, если вы хотите присоединиться к ним как-нибудь еще, просто укажите другую присоединяющую строку в первом параметре #join()

Если ArrayList не является StringВы можете использовать лямбда-выражения для выполнения той же операции:

String messageString = messages[index].stream().map(Object::toString)
                        .collect(Collectors.joining(", "));
0 голосов
/ 08 апреля 2019

Вы можете сделать это в соответствии с условием, если 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++]);
    }
}

}

0 голосов
/ 08 апреля 2019

Попробуйте, это может быть полезно

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