私はレイアウトファイルにすべての要素にIDを付け、JavaクラスにはLocate()というメソッドを用意しました。私が返すのは:
return findViewById(R.id.star);
しかし、シンボルfindViewByIdを解決できないと書かれています。また、メソッドの戻り値の型として何を宣言すればよいかわかりません。
だから私のコードは次のようになります。
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
はのメソッドでView
あり、ActivityのメソッドであるためView
、Activity
を呼び出すにはまたはのインスタンスが必要です。
おそらく、アクティビティまたはビュー内にいるため、今は機能しますが、別の場所に移動したら、そのアクティビティまたはビューで呼び出す必要があります。
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 = (TextView) locate();
ジェネリックを使用すると、コードがよりクリーンになります。
TextView t = locate();
PS:少し前findViewById
に戻りましたが、実際には戻りView
、戻り値の型をキャストしていました。現在、Googleはジェネリック向けに変更しており、変更する必要はありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加