@Liankir

Правильная обработка выбора элементов Spinner'a, при условии наличия нескольких локализаций?

Существует выпадающий список (Spinner), заполненный строковыми элементами, которые содержаться в <string-array> и отсортированы в алфавитном порядке. Когда мне необходимо обработать выбор какого-либо элемента пользователем, я использую примерно такой код:

public class MyActivity extends Activity {
Spinner ct;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ct = (Spinner) findViewById(R.id.spinner);

    ArrayAdapter categories = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item,
            getResources().getStringArray(R.array.some_array));

    categories.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    
    ct.setAdapter(categories);

    ct.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            switch (position) {
                case 0:
                    //performing action #1
                break;
                case 1:
                    //performing action #2
                break;
                etc.
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });
}
}


Это отлично работает пока в приложении только один язык, но в случае, когда добавляется еще одна (несколько) локализация, строковые ресурсы будут переведены на соответствующий язык, а элементы в <string-array> будут иметь несколько другой порядок. Соответственно, вышеуказанный код не сможет правильно обработать выбор пользователя, так как порядок элементов в выпадающем списке будет различным для каждой локализации. В таком случае мне приходиться использовать следующий вариант:

ct.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

    String chosenStr = ct.getSelectedItem().toString();
        switch (chosenStr) {
            case "Строка #1 в первой локализации":
                //performing some action #1
            break;
            case "Строка #1 во второй локализации":
                //performing some action #1
            break;
            case "Строка #2 в первой локализации":
                //performing some action #2
            break;
            case "Строка #2 во второй локализации":
                //performing some action #2
            break;
        }
    }
});


Мне не нравится такой подход, и я хотел узнать, не существует ли иного, более правильного и элегантного варианта реализации?
  • Вопрос задан
  • 5069 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bimeg
Можно рядом с <string-array> держать <integer-array>

<string-array name="arr">
	<item >Str1</item>
	<item >Str2</item>
	<item >Str3</item>
</string-array>
	
<integer-array name="arrInd">
	<item >1</item>
	<item >2</item>
	<item >3</item>
</integer-array>


В других языках менять порядок соответственно.
И обработка:

public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{
	int globalInd = getResources().getIntArray(R.array.arrInd)[position];

	switch (globalInd)
	{
		...
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы