Приложение вылетает, когда я меняю язык из массива строк - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь изменить язык в своем представлении адаптера стиля выпадающего меню, в котором используется спиннер adpater для получения данных из массива строк. Я создал две разные строки. xml на основе локалей (одна для французского и одна для английского sh), но когда я переключился на французский и нажал на выпадающее меню счетчика, приложение вылетало.

Ниже строки. xml внутри каталога значений по умолчанию

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Color Picker</string>
    <string name="new_name">Color Name</string>
    <string name="select">Please select a color</string>
    <string name="color1">Cyan</string>
    <string name="color2">Gray</string>
    <string name="color3">Yellow</string>
    <string name="color4">Green</string>
    <string name="color5">Magenta</string>
    <string name="color6">Blue</string>
    <string name="color7">White</string>
    <string name="color8">Red</string>
    <string-array name="color_array">
        <item>@string/select</item>
        <item>@string/color1</item>
        <item>@string/color2</item>
        <item>@string/color3</item>
        <item>G@string/color4</item>
        <item>@string/color5</item>
        <item>@string/color6</item>
        <item>@string/color7</item>
        <item>@string/color8</item>
    </string-array>
</resources>

Ниже приведены строки. xml внутри каталога values-fr-rFR

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Palette de Couleurs</string>
    <string name="new_name">Couleur Choisie</string>
    <string name="select">Choisissez une Couleur</string>
    <string name="color1">Marron</string>
    <string name="color2">Gris</string>
    <string name="color3">Jaune</string>
    <string name="color4">Vert</string>
    <string name="color5">Magenta</string>
    <string name="color6">Bleu</string>
    <string name="color7">Blanc</string>
    <string name="color8">Rouge</string>
    <string-array name="color_array">
        <item>@string/select</item>
        <item>string/color1</item>
        <item>string/color2</item>
        <item>string/color3</item>
        <item>string/color4</item>
        <item>string/color5</item>
        <item>string/color6</item>
        <item>string/color7</item>
        <item>string/color8</item>
    </string-array>
</resources>

Это код внутри моего пользовательского адаптера, возвращающий мой пользовательское представление (представления - простые текстовые представления)

private fun getCustomView(position: Int, convertView: View?, parent: ViewGroup): View {
    val view: View
    val txt: String = getItem(position).toString()

    if (convertView == null) {
        view = inflater.inflate(resID, parent, false)

        val textView = view.findViewById<TextView>(R.id.txtTextView)
        //txt = list[position]
        textView.text = txt

        setBackground(view, txt, position)

    } else {
        view = convertView
        setBackground(view, txt, position)
    }

    return view
}

Это мое основное занятие - все работает на английском sh, кроме как на французском - когда вы щелкаете по выпадающему меню и выбираете цвет, начинается новое действие и отображается выбранный цвет. Когда язык французский, нажатие на спиннер автоматически приводит к сбою приложения без возможности выбрать цвет

val colors = resources.getStringArray(R.array.color_array)

val spinner = findViewById<Spinner>(R.id.colorSpinner)

spinner?.adapter = (CustomAdapter(this, R.layout.activity_dropdown, colors))

spinner.onItemSelectedListener = object : OnItemSelectedListener{
    override fun onNothingSelected(parent: AdapterView<*>?) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
        val color = parent!!.getItemAtPosition(position).toString()

        if(position == 0){
            return
        }else{
            val intent = Intent(this@MainActivity, NewActivity::class.java).apply {
                putExtra(COLOR_MESSAGE, color)
            }
            startActivity(intent)
        }
    }
}

}

Вот трассировка стека в приложении cra sh

2020-02-26 18:34:44.476 26860-26887/com.edu.coloractivity E/eglCodecCommon: GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1
2020-02-26 18:34:46.681 26860-26860/com.edu.coloractivity E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.edu.coloractivity, PID: 26860
    java.lang.IllegalArgumentException: Unknown color
        at android.graphics.Color.parseColor(Color.java:1400)
        at com.edu.coloractivity.CustomAdapter.setBackground(CustomAdapter.kt:64)
        at com.edu.coloractivity.CustomAdapter.getCustomView(CustomAdapter.kt:35)
        at com.edu.coloractivity.CustomAdapter.getView(CustomAdapter.kt:42)
        at android.widget.BaseAdapter.getDropDownView(BaseAdapter.java:73)
        at com.edu.coloractivity.CustomAdapter.getDropDownView(CustomAdapter.kt:46)
        at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:994)
        at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:990)
        at android.widget.Spinner.measureContentWidth(Spinner.java:856)
        at android.widget.Spinner$DropdownPopup.computeContentWidth(Spinner.java:1225)
        at android.widget.Spinner$DropdownPopup.show(Spinner.java:1251)
        at android.widget.Spinner.performClick(Spinner.java:780)
        at androidx.appcompat.widget.AppCompatSpinner.performClick(AppCompatSpinner.java:443)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25885)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

1 Ответ

0 голосов
/ 27 февраля 2020

Это, вероятно, просто опечатки. Внутри вашего color_array на английском языке Engli sh у вас есть элемент с буквой G перед @

<item>G@string/color4</item>

И на французском языке вы забыли символ @ before 'string' в нескольких элементах.

<item>string/color1</item>
<item>string/color2</item>
<item>string/color3</item>
<item>string/color4</item>
<item>string/color5</item>
<item>string/color6</item>
<item>string/color7</item>
<item>string/color8</item>

Попробуйте исправить это и посмотрите, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...