Доступ к защищенному методу в Java (Android)

#android #protected #numberpicker

#Android #защищенный #numberpicker

Вопрос:

Я учусь создавать приложения в Android Studio. Я создаю программу numberpicker. Я хочу изменить размер своего numberpiker.

Чтобы изменить размер моего numberpicker, я нашел защищенный метод под названием onMeasure в документации разработчика. https://developer.android.com/reference/android/widget/NumberPicker

 NumberPicker p_myNumberPicker = new NumberPicker(this);
p_myNumberPicker.setMaxValue(150);
p_myNumberPicker.setMinValue(0);
p_myNumberPicker.onMeasure(100,100);
NumberPicker.OnValueChangeListener myValChangedListener = new NumberPicker.OnValueChangeListener() {
    @Override
    public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
        p_number.setText("" newVal);
    }
  

Моя проблема в том, что у меня есть сообщение об ошибке «onMeasure (int, int) имеет защищенный доступ в android.widget.NumberPicker».
Как я могу это исправить?

Ответ №1:

Просто прочитайте ниже документацию по методу, и вы найдете:

КОНТРАКТ: При переопределении этого метода необходимо вызвать setMeasuredDimension(int, int), чтобы сохранить измеренную ширину и высоту этого представления. Невыполнение этого требования вызовет исключение IllegalStateException, вызываемое measure(int, int). Вызов onMeasure суперкласса(int, int) является допустимым использованием.

Реализация базового класса measure по умолчанию использует размер фона, если только в MeasureSpec не допускается больший размер. Подклассы должны переопределять onMeasure(int, int), чтобы обеспечить лучшие измерения их содержимого.

Ответ №2:

просто удалите эту строку:

 p_myNumberPicker.onMeasure(100,100);
  

потому что вы нарушаете область доступа метода, который не предназначен для вызова подобным образом. если вы действительно хотите его вызвать, вы должны использовать CustomNumberPicker extends NumberPicker и вызвать этот protected метод из его области видимости. только тогда область доступа будет соответствовать определению.

Ответ №3:

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