如何在Java类中创建返回findViewById的方法?

如何在Java类中创建返回findViewById的方法?,java,android,Java,Android,我给布局文件中的每个元素一个ID,在java类中我有一个名为locate()的方法。我要回报的是: return findViewById(R.id.star); 但它表示无法解析符号findviewbyd。另外,我也不知道应该声明什么作为方法的返回类型。因此,我的代码是这样的 public class Tank { public int x; public int y; public String face; public Tank(int xPos,int

我给布局文件中的每个元素一个ID,在java类中我有一个名为locate()的方法。我要回报的是:

return findViewById(R.id.star);
但它表示无法解析符号findviewbyd。另外,我也不知道应该声明什么作为方法的返回类型。
因此,我的代码是这样的

public class Tank {
    public int x;
    public int y;
    public String face;

    public Tank(int xPos,int yPos){
        x=xPos;
        y=yPos;
    }

    public RETURNTYPE locate(){
        return findViewById(R.id.star);
    }
}

我不知道返回类型应该是什么,findViewById无法解析。我手动创建了这个类(不是自动生成的)。

使用
findViewById()
时需要适当的上下文,例如:

public <T extends View> T locate(Activity ctx){
    return ctx.findViewById(R.id.star);
}
public T locate(活动ctx){
返回ctx.findViewById(R.id.star);
}
视图的一种方法,也是的一种方法,因此需要
视图
活动
的实例来调用它

可能它现在对您有效,因为您在活动或视图中,但一旦您将其移动到其他地方,您需要在所述活动或视图中调用它,即:

View locate(Activity activity) {
  return activity.findViewById(R.id.star);
}

View locate(View view) {
  return view.findViewById(R.id.star);
}
注意,我将返回
View
作为返回类型?虽然这并不是错误的,但事实上这不是最好的,我们可以做得更好

如果您注意到,
finViewById
返回扩展
View
的泛型类型。换句话说,这是一个具体的视图,因此我们可以重写上述方法,如下所示:

<T extends View> T locate(Activity activity) {
  return activity.findViewById(R.id.star);
}

<T extends View> T locate(View view) {
  return view.findViewById(R.id.star);
}
使用泛型,代码变得更加干净:

TextView t = locate();

PS:前一段时间,
findViewById
实际返回了
View
,我们都在铸造返回类型。如今,谷歌将其改为泛型,我们不需要。

无需采取
活动
上下文
来查找
视图
。因为您将通过
findViewById()
找到的每个视图都是任何
视图组的子视图。那就去吧

public <T extends View> T locate(View parentView){
    return parentView.findViewById(R.id.star);
}
public T定位(查看父视图){
返回parentView.findviewbyd(R.id.star);
}

什么是“T”意思?它意味着,它可以返回扩展view类的任何类型。那么我应该添加什么来扩展它呢?如果提供的上下文没有星图呢?这个建议鼓励不良实践我将
上下文
更改为
活动
。为什么你希望
坦克
类有一个返回星号的方法
视图
?因为我希望它做一些事情来启动…如果活动没有星号怎么办?你在推荐一个糟糕的做法这其中哪一部分是糟糕的做法?从给出的上下文来看,我认为这个答案足以理解如何进行。如果明星应该总是在应用程序的域中,那么我不会添加任何其他内容,因为崩溃对我来说是正确的行为,因为没有明星很可能是开发者的错误。如果有一个不存在星号的用例,那么必须处理这个问题,我认为OP知道
findViewById
可能会返回null,因为我指向了文档。附言:我不是在推荐任何东西,我是在解释它是如何工作的。不参与生命周期的课程不应该硬引用观点或上下文。仅仅回答答案并没有错,但也不是一件正确的事情。提出一些不是解决问题的好方法的建议是一个道德难题。我不确定我是否理解。。。这个类没有引用。它是一个接收参数且不包含任何引用的方法。我同意你所说的,但我不知道这和我的答案有什么关系。是的,你是对的,这个方法的范围!说得好,谢谢
public <T extends View> T locate(View parentView){
    return parentView.findViewById(R.id.star);
}