У меня проблемы с пониманием того, как сравнивать строки в Java для Android. Я написал код для этого на JavaScript и Palm, но я новичок в Java и немного запутался. Например, я пытаюсь изменить пример на сайте разработчиков Android для SpinnerActivity (http://developer.android.com/resources/samples/Spinner/src/com/android/example/spinner/SpinnerActivity.html). В моем приложении я смотрю на размеры труб в счетчике, а не на планетах. Когда пользователь выбирает размер трубы, я хочу сослаться на массив размеров труб и иметь возможность выбирать другие параметры, связанные с этим размером трубы, такие как внешний диаметр (OD) трубы. Я изменил приведенный выше пример кода и добавил и массив для размеров труб и размеров наружного диаметра. Затем я пытаюсь сравнить то, что пользователь выбрал в счетчике размеров труб, с моим массивом размеров труб и использовать номер массива, который соответствует, чтобы выбрать связанный OD. Что-то не так с тем, как я пытаюсь провести это сравнение. Я установил оба этих значения как укусы, но они, кажется, никогда не находят друг друга.

Раздел HelloSpinner1.java, который я изменил:

       public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) {

            HelloSpinner1.this.mPos = pos;
            HelloSpinner1.this.mSelection = parent.getItemAtPosition(pos).toString();
            /*
             * Set the value of the text field in the UI
             */
            TextView resultText = (TextView)findViewById(R.id.SpinnerResult);
            resultText.setText(HelloSpinner1.this.mSelection);

            String[] OD;              // array of pipe ODs
            OD = new String[30];      // allocates memory for 30 floating point numbers
            OD[0] = "0.405";
            OD[1] = "0.540";
            OD[2] = "0.675";
            OD[3] = "0.840";
            OD[4] = "1.050";
            OD[5] = "1.315";
            OD[6] = "1.660";
            OD[7] = "1.9";
            OD[8] = "2.375";
            OD[9] = "2.875";
            OD[10] = "3.5";
            OD[11] = "4";
            OD[12] = "4.5";
            OD[13] = "5.563";
            OD[14] = "6.625"; 
            OD[15] = "8.625";
            OD[16] = "10.750";
            OD[17] = "12.75";
            OD[18] = "14";
            OD[19] = "16";
            OD[20] = "18";
            OD[21] = "20";
            OD[22] = "22";
            OD[23] = "24";
            OD[24] = "26";
            OD[25] = "28";
            OD[26] = "30";
            OD[27] = "32";
            OD[28] = "34";
            OD[29] = "36";


String [] Size;
Size = new String [30];
            Size[0] = "1/8";
            Size[1] = "1/4";
            Size[2] = "3/8";
            Size[3] = "1/2";
            Size[4] = "3/4";
            Size[5] = "1";
            Size[6] = "1-1/4"; 
            Size[7] = "1-1/2";
            Size[8] = "2";
            Size[9] = "2-1/2";
            Size[10] = "3";
            Size[11] = "3-1/2";
            Size[12] = "4";
            Size[13] = "5";
            Size[14] = "6";
            Size[15] = "8";
            Size[16] = "10";
            Size[17] = "12";
            Size[18] = "14";
            Size[19] = "16";
            Size[20] = "18";
            Size[21] = "20";
            Size[22] = "22"; 
            Size[23] = "24";
            Size[24] = "26";
            Size[25] = "28";
            Size[26] = "30";
            Size[27] = "32";
            Size[28] = "34";
            Size[29] = "36"; 



            String ODSize;

            for (int i = 0; i  <= 29; i++){
                    if (Size.equals("HelloSpinner1.this.mSelection")) {
                    ODSize = OD[i];
                    break;
                     }
                }  

        }

Связанный файл strings.xml на сайте Android с небольшими изменениями:

Труба и трубка
1/8 1/4 3/8 3/4 1 1-1/4 1-1/2 2 2-1/2 3 3-1/2 4 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 Выберите размер трубы

0
63alfred 27 Мар 2011 в 05:55

1 ответ

Просто быстрое примечание, но я вижу здесь две вещи:

1) У вас "HelloSpinner1.this.mSelection" в кавычках. Внутри .equals это сравнивает вашу переменную Size непосредственно с этой строкой... а не со значением, хранящимся в этом объекте. Например, вы спрашиваете: "1/8" ?= "HelloSpinner1.this.mSelection" ... а не "1/8" ?= "1/4" в данном случае. Это может быть большая часть вашей проблемы здесь.

2) Вы можете просто использовать положение счетчика внутри вашего метода Listener. Это дает вам позицию выбора на счетчике. Если вы не изменяете эти значения, вы уже знаете индекс в своем массиве. Если вы изменяли их, /тогда/ вы могли бы выполнить сравнение строк (или одновременно изменить свой массив, чтобы поддерживать их в актуальном состоянии).

Вы также можете проверить, с чем вы сравниваете, как только устраните проблему с кавычками. Очень простой способ сделать это — объявить String для каждого значения, а затем запустить его в отладчике или зарегистрировать вывод.

Наконец, как личное предпочтение, я не люблю хранить длинные массивы, которые не будут меняться в файле xml. Просто закодируйте это как массив, который не нужно интерпретировать позже. Это даст вам прямой доступ к массиву и немного ускорит выполнение.

0
AndyMac 27 Мар 2011 в 06:10
Я использовал ваш вариант 2) и он работал отлично. Не очень понимаю, что вы подразумеваете под «Просто закодируйте это как массив, который не нужно интерпретировать позже», но опять же, я новичок в этом. Еще раз спасибо, так как ваша помощь была очень ценной.
 – 
63alfred
27 Мар 2011 в 12:49
Я не уверен, как вы храните свои данные внутри (и это нормально). Однако я предлагаю, если у вас есть массив значений, который не будет меняться, сделайте его частью класса, которому нужны эти значения, а не массив строк в xml. IE: в вашем коде: String[] myArr = new String[20]; Установите значения один раз, и вы получите к ним доступ без необходимости интерпретировать ваш код массива строк xml как числа. Вы сделали это с внешним диаметром (хотя вам, вероятно, следует определить его где-то еще, а не в методе, чтобы он не создавался несколько раз).
 – 
AndyMac
27 Мар 2011 в 19:38
При дальнейшем рассмотрении вы используете массив строк для текста счетчика, я полагаю? Тем не менее, вы можете иметь внутренний массив этих размеров как двойные, чтобы вы могли гораздо более тривиально сравнить размер трубы в два раза с двойным внешним диаметром. В любом случае, просто предложение в качестве улучшения.
 – 
AndyMac
27 Мар 2011 в 19:39
Вы очень помогли. Я использовал пример на сайте Android (developer.android.com/resources/samples/Spinner/src/com/android/…), чтобы создать это. Приведенный там счетчик намного сложнее, чем обучающий счетчик, и поэтому большую часть кода в файле .java я все еще пытаюсь понять. В частности, я пытался установить начальное значение счетчика, используя DEFAULT_POSITION, определенный в этом примере кода. К сожалению, когда я меняю значение, изначально назначенное этому, ничего не происходит. Я предполагаю, что мне нужно искать помет усерднее.
 – 
63alfred
28 Мар 2011 в 10:05