我有一个名为Animal的抽象活动和两个具体的后代活动猫和狗。
Cat& Dog将呈现相同的UI,由单个按钮组成,因此有一个布局,即Animal在OnCreate中设置的内容视图的activity_animal.xml。
我想通过OnClickListener的匿名实现在抽象Animal类中设置按钮的OnClickListener
private void setClickHandlers() {
((Button) findViewById(R.id.btn))
.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
//how to get a reference to this?
}
});
}
在onClick中我想创建一个新的Intent。要制作Intent,我需要引用 this 。 通常,在这样的匿名方法代码中,我可以使用诸如的语法 的 EnclosingClass.this 但在这里,我不知道封闭的课程是什么。在运行时,它可能是猫或狗。
怎么做?
我能想到的唯一方法是在Animal中提供一个抽象的getThis(),它在每个具体的后代中被覆盖。
答案 0 :(得分:1)
您应该可以说Animal.this
作为您的背景。
private void setClickHandlers() {
View view = findViewById(R.id.btn);
view.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(Animal.this, MyDestinationActivity.class);
...
}
});
}
Animal.this
可以是Cat
或Dog
,但由于您只需Context
,因此区别无关紧要。
答案 1 :(得分:1)
public void onClick(View arg0) {
Activity host = (Activity) arg0.getContext();
}
答案 2 :(得分:0)
我会这样做:
private void setClickHandlers() {
final Animal thiz = this;
((Button) findViewById(R.id.btn))
.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
Intent intent = new Intent( thiz, AAAA.class );
}
});
}
答案 3 :(得分:0)
您可以使用instanceof
运算符确定运行时类型。
if (Animal.this instanceof Dog) {
// dog related
}
else {
// cat related
}