Ошибка при приведении между Button и моим пользовательским классом MyButton, который расширяет Button - PullRequest
0 голосов
/ 24 декабря 2018

Я занимаюсь разработкой приложения для Android с помощью Android Studio.Я написал собственный класс с именем «MyButton», который расширяет Button.У меня также есть файл ресурсов с несколькими кнопками.При выполнении я получаю исключение, говорящее, что я не могу привести Button к MyButton.Строка:

myButton = (MyButton) view.findViewById(R.id.button1);

button1 - это идентификатор кнопки, объявленной в файле ресурсов.myButton - это данные типа класса MyButton.

Ответы [ 5 ]

0 голосов
/ 24 декабря 2018

Вместо этого приведения вы можете сделать следующее:

Сначала ваш класс MyButton должен использовать этот конструктор:

MyButton(Context context, AttributeSet attrs)

Затем в вашем макете используйте вашу пользовательскую кнопку:

<com.mypackagename.MyButton
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

Наконец, вы можете обратиться к своей пользовательской кнопке

MyButton button = findViewById(R.id.button);
0 голосов
/ 24 декабря 2018

Поскольку вы не прикрепляли источник макета (XML), я не уверен, что вы использовали свой собственный класс MyButton для создания кнопки, подобной R.id.button1 .Вы должны сделать что-то вроде вашего макета XML:

<your-package-name.MyButton
    android:id="@+id/button1"
    android:text="Coureur 1"
    android:clickable="true"
    android:text="Your button title"/>
0 голосов
/ 24 декабря 2018

Вы можете выполнять приведение типа так:

public class MyButton extends android.support.v7.widget.AppCompatButton {

    public MyButton(Context context) {
        super(context);
    }
}

MyButton myButton = findViewById(R.id.my_button);

Уровень API 26 выше не требует объявления типов преобразования.Пока дочерний класс все еще поддерживает конструктор, должен принадлежать родительскому, ошибок не будет

0 голосов
/ 24 декабря 2018

Вы не можете сделать это.

Поскольку вы создали MyButton с помощью кнопки.Кнопка является независимой, но MyButton зависит от кнопки.Когда вы объявляете

MyButton button = (Button) findByElementById()

Это вызывает ошибку компилятора. Поскольку компилятор знает, что MyButton - кнопка только для кнопки, кнопка не является MyButton.

Но Вы можете сделать это следующим образом

Button button = new MyButton()

Поскольку MyButton () является кнопкой ()

или

Button button = (Button) new MyButton() 

Но здесь Вам не нужно приводить MyButton () к Button (), потому что компилятор уже знает, что MyButton () является Button ()

В Java вы можете использовать только Upcasting и Downcasting.Ознакомьтесь с правилами Java Downcasting и Upcasting, которые сделают вас более понятными

0 голосов
/ 24 декабря 2018

Начиная с API 26, findViewById() использует логический вывод для своего типа возвращаемого значения, поэтому вам не нужно приводить.Вы можете использовать приведенный ниже код для создания вашего объекта

MyButton myButton = (MyButton) view.findViewById(R.id.buttonCoureur1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...