Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在嵌套类中获取上下文?_Java_Android_Kotlin - Fatal编程技术网

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

Java 如何在嵌套类中获取上下文?,java,android,kotlin,Java,Android,Kotlin,因为show只在嵌套类ButtonHandler中需要,所以我想执行以下操作 public class MainActivity extends AppCompatActivity { private class ButtonHandler implements OnClickListener { @Override public void onClick(View view) { // removed for

因为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();
    }

}
问题 如何在第一种方法中获取Toast.makeText的上下文?我熟悉c语言,但不熟悉java和android

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

使用它指的是ButtonHandler,它不会工作,因为它本身没有上下文。而是使用MainActivity.thisthis@MainActivity在Kotlin中,指的是外部类别:

Toast.makeText(MainActivity.this, s, LENGTH_LONG).show();
处理嵌套类时,必须指定哪个类

使用它指的是ButtonHandler,它不会工作,因为它本身没有上下文。而是使用MainActivity.thisthis@MainActivity在Kotlin中,指的是外部类别:

Toast.makeText(MainActivity.this, s, LENGTH_LONG).show();
如果ButtonHandler看起来是一个非静态的内部类,您可以使用MainActivity。为了对上下文进行引用,可以使用MainActivity而不是this:

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

show(v.getContext(), s);
如果ButtonHandler看起来是一个非静态的内部类,您可以使用MainActivity。为了对上下文进行引用,可以使用MainActivity而不是this:

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

show(v.getContext(), s);

可以通过MainActivity.this访问外部类实例。此外,还可以通过MainActivity.this访问字段。

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

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

private Activity activity;
在onCreate方法中:

this.activity = 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();
        }
    }   

}

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

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

private Activity activity;
在onCreate方法中:

this.activity = 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();
        }
    }   

}

请不要因为没有好的代码风格而杀了我,因为你的内部类不是stati,我可以访问外部环境。因为你的内部类不是stati,我可以访问外部环境。java中嵌套类的概念不同于c。在c中,设计不允许从InnerClass中访问OuterClass.this。java中嵌套类的概念与c不同。在c语言中,设计不允许从内部类访问OuterClass.this。