如何在嵌套类中获取上下文?

时间:2018-02-23 17:09:20

标签: java android

因为只在嵌套类show中需要ButtonHandler,所以我想执行以下操作

public class MainActivity extends AppCompatActivity
{
    private class ButtonHandler implements OnClickListener
    {
        @Override
        public void onClick(View view)
        {
           // removed for simplicity
        }
        private void show(String s)
        {
            //Toast.makeText(this, s, LENGTH_LONG).show();
        }
    }   

}

而不是以下。

public class MainActivity extends AppCompatActivity
{
    private class ButtonHandler implements OnClickListener
    {
        @Override
        public void onClick(View view)
        {
           // removed for simplicity
        }
    }

    private void show(String s)
    {
        Toast.makeText(this, s, LENGTH_LONG).show();
    }

}

问题

如何在第一种方法中获取this的上下文Toast.makeText?我熟悉c#但不熟悉java和android。

4 个答案:

答案 0 :(得分:2)

如果ButtonHandler是非静态内部类(它看起来像是),您可以使用MainActivity.this而不是this来引用Context 1}}:

Toast.makeText(MainActivity.this, s, LENGTH_LONG).show();

如果ButtonHandler是静态的(因此MainActivity.this不起作用),您必须以某种方式将上下文对象传递给方法。假设您从show()方法调用onClick(),您可以利用View.getContext()并写下:

show(v.getContext(), s);
private void show(Context c, String s)
{
    Toast.makeText(c, s, LENGTH_LONG).show();
}

答案 1 :(得分:1)

在处理嵌套类时,您必须指定哪个类。

使用this是指ButtonHandler,它不起作用,因为它本身没有上下文。相反,使用MainActivity.this(Kotlin中的this@MainActivity)来引用外部类:

Toast.makeText(MainActivity.this, s, LENGTH_LONG).show();

答案 2 :(得分:1)

可以通过MainActivity.this访问外部类实例。同样,可以通过MainActivity.this.field访问字段。

答案 3 :(得分:1)

您还可以创建一个私有变量

private Activity activity;

并在您的onCreate方法中:

this.activity = this;

因为在每个嵌套类中您都可以访问每个外部变量,但是“ this”当然不能工作。因此,您的示例如下所示:

public class MainActivity extends AppCompatActivity{

    private Activity activity;

    public void onCreate(...){
        this.activity = this;
        ...
    }

    private class ButtonHandler implements OnClickListener
    {
        @Override
        public void onClick(View view)
        {
           // removed for simplicity
        }
        private void show(String s)
        {
            //Toast.makeText(activity, s, LENGTH_LONG).show();
        }
    }   

}

请不要因为不好的代码风格而杀了我