java - 如何在静态类中使用 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)””
解决方案
我假设这个函数存在于你的Activity
类中,并且你想处理一些基于View
. 有两种方法可以解决这个问题:
- 删除静态修饰符并让实例处理这个。
- 创建一个包含在
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
以声明为非静态!
推荐阅读
- visual-studio - 无法在特征文件中执行转到定义功能以导航到量角器-黄瓜框架中的步骤定义文件
- r - 在每个分位数内随机分配大小相等的子组
- android - Flutter MediaQuery.of(context).size.width 检查设备大小总是在 iOS 模拟器中返回相同的错误值
- c++ - 是否可以确定传递的迭代器是否属于关联 std 容器?
- reactjs - 在 create-react-kotlin-app 模块中 npm start 后编译失败
- ruby-on-rails - 从页面解析图像,查看它们并保存选定的
- ruby-on-rails - 外键约束确实会导致 N+1 查询,但没有约束,急切加载可以正常工作
- python - 训练 Keras 模型会产生多个优化器错误
- python - 我如何了解是否使用了内存地址?
- firebase - AWS Lambda,添加 firebase 模块及其依赖项以与 Angular Universal 一起使用