首页 > 解决方案 > 如何在静态类中使用 findviewbyid?

问题描述

我有一个静态类:

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();
    }

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

标签: java

解决方案


我假设这个函数存在于你的Activity类中,并且你想处理一些基于View. 有两种方法可以解决这个问题:

  1. 删除静态修饰符并让实例处理这个。
  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会比活动寿命更长。而不是这个,你应该考虑使用我在列表中建议的方法作为选项 1,看看为什么你不能在你的程序中使用实例方法。你应该阅读更多关于这个线程

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


推荐阅读