Как я могу использовать findviewbyid в классе stati c? - PullRequest
0 голосов

У меня есть класс stati c:

public static void culculateFprice(){
    TextView FinalBuy = (TextView) findViewById(R.id.buyText);
    int Pprice = MainActivity.pepperoni.getFinalPrice();
    int Cprice = MainActivity.calzone.getFinalPrice();
    int QCprice = MainActivity.quattrostagioni.getFinalPrice();
    int QFprice = MainActivity.quattroformaggi.getFinalPrice();
    int Mprice = MainActivity.mexican.getFinalPrice();
    int FinalPrice = Pprice + Cprice + QCprice + QFprice + Mprice;
    FinalBuy.setText("Стоимось вашего заказа: " + FinalPrice + " руб.");
}

Как я могу найти findViewById в этом классе? Я вызываю этот метод из этого метода

public static void onPlus(int i){
        ArrayList<String> list = listok();
        switch (list.get(i)){
            ...
        }
        adapteR.refreshData(listokadd());
        culculateFprice();
    }

, и у меня возникла проблема «Нестандартный c метод« findViewById (int) »нельзя ссылаться из статического c контекста»

1 Ответ

0 голосов
/ 03 мая 2020

Я предполагаю, что эта функция существует в вашем классе Activity, и вы хотели бы обработать некоторую информацию, основанную на View. Это можно решить двумя способами:

  1. Удалите модификатор stati c и позвольте экземпляру позаботиться об этом.
  2. Создайте поле, содержащее ссылку View, которая создается сразу после установки макета.

Таким образом, Activity будет содержать поле:

class MyActivity extends Activity {
    static View FinalBuy; // needs to be static, otherwise would give same error
}
@Override
void onCreate(Bundle savedInstance) {
    // after setLayout
    FinalBuy = (TextView) findViewById(R.id.buyText);
}

Но чтобы сохранить ваш код от потенциальной ошибки времени выполнения, используйте блок if...else в вашем методе stati c:

public static void culculateFprice(){
    if(FinalBuy != null) {
        // your code here.
    }
}

Эта проблема является основной c Java а не Android. Таким образом, язык Java предназначен для обеспечения методов экземпляра и статуса c для программ.

Эта декларация static View приводит к потенциальной уязвимости проекта, поскольку эта View переживет действие. Вместо этого вам следует рассмотреть возможность использования подхода, предложенного в списке в качестве варианта 1, и понять, почему вы не можете использовать метод экземпляра в своей программе. Вы должны прочитать больше на этой теме .

Скорее всего, вам потребуется изменить другие поля MainActivity, чтобы они также были объявлены как non-stati c!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...