我正在创建一个抽象基类,以便将导航抽屉代码保存在一个位置,并希望在我的应用程序标题(在工具栏中定义)上实现throw
以启动我的启动活动
我使用以下代码:
onClickListener
该应用程序正常运行,但我读到某个地方不得使用应用程序上下文来启动新活动。但是,android studio不允许我使用除@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.toolbar_title:
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
return;
}
}
和getApplicationContext
之外的任何其他上下文,可能因为这个类是抽象的。
我应该使用哪种上下文?
答案 0 :(得分:2)
嗯,其中一种方法可以是:您可以在BaseActivity
类中定义抽象方法:
abstract void launchMainActivity();
在点击监听器中调用此方法:
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.toolbar_title:
launchMainActivity();
return;
}
}
然后,子类可以将此方法实现为:
@Override
void launchMainActivity() {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
答案 1 :(得分:2)
查看Context.getApplicationContext()
和ContextWrapper.getBaseContext()
。两者的共同点都是在上下文实例上定义的。在您的情况下,它甚至是var a = (function a(PI) {
// In this scope, PI = 3.14
(function b(PI) {
// PI = 100
})(100);
return function c(diameter) {
// PI = 3.14, still in scope `a`
// diameter = 2, passed in from second call
return diameter * PI;
};
});
a_result = a(3.14); // == c, with PI = 3.14
c_result = a_result(2); // c called with diameter = 2, PI = 3.14 from scope `a`
。
因此,您甚至可以使用Activity
作为上下文来启动this
。这甚至更好,因为您可以使用任何其他上下文类型。必须包含标记MainActivity
才能开始新活动。
如果您通过FLAG_ACTIVITY_NEW_TASK
使用上下文来获取错误,那么因为您将this
定义为匿名内部类,当然这不是一个上下文。为此,您必须改为编写OnClickListener
。这引用了外部类实例。