android在抽象基类中获取活动上下文

时间:2016-08-07 19:33:26

标签: android android-toolbar android-context

我正在创建一个抽象基类,以便将导航抽屉代码保存在一个位置,并希望在我的应用程序标题(在工具栏中定义)上实现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之外的任何其他上下文,可能因为这个类是抽象的。

我应该使用哪种上下文?

2 个答案:

答案 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。这引用了外部类实例。