Как убрать глюк в NumberPicker?

Рейтинг: -2Ответов: 1Опубликовано: 16.07.2023

У меня в программе три авторских NumberPicker в ряд. Они прекрасно работают. Но при открытии программы в первом NumberPicker появляется буква "Б", которой даже нет в его массиве. Я всё проверила и не понимаю, откуда она взялась. Помогите, пожалуйста, если у вас есть хоть какие-то предположения на эту тему.

Основная активность:


                private MyNumberPicker myNumberPicker;

                private MyNumberPicker2 myNumberPicker2;

                private MyNumberPicker3 myNumberPicker3;

    private TextView tvNumber,tvResult;

  //Позиция (int) в массиве

                int pos,pos2,pos3;

                 //Создадим массивы значений

                //Для размера шрифта

    final String[] values = {"12", "14", "16", "20"};

    //Для жирного и нормального шрифта

    final String[] values2 = {"В", "N", "B", "N"};

    //Для цвета шрифта

    final String[] values3 = {"Б", "Ч", "К", "С","Ж","З"};

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

       

        myNumberPicker = (MyNumberPicker) findViewById

                               (R.id.my_number_picker);

        myNumberPicker2 = (MyNumberPicker2) findViewById

                               (R.id.my_number_picker2);

        myNumberPicker3 = (MyNumberPicker3) findViewById

                               (R.id.my_number_picker3);

       

        tvNumber= (TextView) findViewById(R.id.hnp_tv_number);    

        tvResult= (TextView) findViewById(R.id.tv_result);

       //Изменяем цвет фона

        myNumberPicker2.setBackgroundColor(Color.YELLOW);

       
        myNumberPicker.setInitialValue(0);

        myNumberPicker.setMinValue(0);

        myNumberPicker.setMaxValue(values.length-1);

       

        myNumberPicker2.setInitialValue(0);

        myNumberPicker2.setMinValue(0);

        myNumberPicker2.setMaxValue(values2.length-1);

       

        myNumberPicker3.setInitialValue(0);

        myNumberPicker3.setMinValue(0);

        myNumberPicker3.setMaxValue(values3.length-1);

       /*

        //Задаём значения, которые будут отображаться в numberPicker.

        myNumberPicker.setDisplayedValues(values);

        myNumberPicker2.setDisplayedValues(values2);

        myNumberPicker3.setDisplayedValues(values3);

        */

        //Устанавливаем, должно ли отображаться первое число,

        //как только мы достигнем конца.

        myNumberPicker.setWrapSelectorWheel(true);

        myNumberPicker2.setWrapSelectorWheel(true);

        myNumberPicker3.setWrapSelectorWheel(true); 

        //Получить позицию из NumberPicker

        pos=myNumberPicker.getValue();

        pos2=myNumberPicker2.getValue();

        pos3=myNumberPicker3.getValue();

       

      //Изменяем значение tvResult                      

                if(pos<=values.length-1)

                tvResult.setText(values[pos]);                                

                if(pos2<=values2.length-1)

                tvResult.setText(values2[pos2]);         

                if(pos3<=values3.length-1)

                tvResult.setText(values3[pos3]);

    }

}

А это макет NumberPicker. У меня все три счётчика с одним макетом, но с разными, но аналогичными классами.


<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <RelativeLayout

        android:layout_width="80dp"

        android:layout_height="80dp"

        android:background="#CCCCCC00"

        >

      

        <TextView

            android:id="@+id/hnp_tv_number"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerVertical="true"

            android:layout_centerHorizontal="true"

            android:textSize="30dp"

            android:textStyle="bold"

            android:layout_marginRight="4dp"

            android:textColor="#CCCCCC00"

            />

        <TextView

            android:id="@+id/tv_result"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text=""

            android:textSize="30dp"

            android:layout_centerHorizontal="true"

            />

       

    </RelativeLayout>

</merge>

Слушатели в классах счётчиков аналогичные:

//Создаём слушатель для TextView

                //При нажатии текста значение меняется на следующую цифру

                    tvNumber.setOnClickListener(new View.OnClickListener() {

                       

                                               @Override

                        public void onClick(View view) {

                                //При нажатии выводим следующую цифру

                             setValue(getValue()+1);

                            //Если цифра равна макс значению+1,

                            //выводим минимальное значение

                            if(getValue()==getMaxValue()+1)

                                setValue(getMinValue());

                           

                          //Получить позицию из NumberPicker              

                            pos=getValue();             

                           //Изменяем значение tvResult                                 

                                if(pos<=values.length-1)

                                tvResult.setText(values[pos]);                                

                        }

                    });      

введите сюда описание изображения введите сюда описание изображения

Ответы

▲ 0Принят

В pos3 у вас что при инициализации? Правильно, 0.

А последняя операция в onCreate() какая?

if(pos3<=values3.length-1)

            tvResult.setText(values3[pos3]);

Условие выполняется? Конечно, вот вам Б.

Дополнение:
когда вы ищете компонент разметки таким способом, и их у вас несколько с одним и тем же ID (tv_result)

tvResult= (TextView) findViewById(R.id.tv_result);

То система найдет первый попавшийся в иерархии (из первого пикера).

Не видя всей разметки предположу что надо искать вот так:

tvResult = (TextView) myNumberPicker3.findViewById(R.id.tv_result);

Это для третьего, первый и второй соответственно.