如何在静态类中使用findviewbyid?

时间:2020-05-03 15:49:11

标签: java

我有一个静态课程:

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 + " руб.");
}

如何在此类中使用find findViewById? 我从这个方法叫这个方法

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

有问题“无法从静态上下文中引用非静态方法“ findViewById(int)””

1 个答案:

答案 0 :(得分:0)

我假设您的Activity类中存在此函数,并且您想基于View处理一些信息。有两种方法可以解决此问题:

  1. 删除static修饰符,然后让实例来处理。
  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块:

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

此问题是基本Java而不是Android。这就是Java语言被设计用来为程序提供实例与静态方法的方式。

static View声明导致潜在的设计缺陷,因为此View将使Activity失效。取而代之的是,您应该考虑使用列表中建议的方法作为选项1,并查看为什么无法在程序中使用实例方法。您应该阅读this thread的更多信息。

这可能需要您将MainActivity的其他字段也更改为声明为非静态!