Java 在安卓系统中,什么时候上下文不同于;这是什么;?

Java 在安卓系统中,什么时候上下文不同于;这是什么;?,java,android,android-context,Java,Android,Android Context,我在Android(以及Java)上的编程处于初级阶段。我知道活动继承自上下文类。然而,在我遇到的每个代码片段中,每次必须提及上下文时,它都被设置为“this” 我的问题是:什么时候上下文与“this”不同?你能提供一个真实生活的例子,说明上下文需要与“this”不同吗 非常感谢。例如,当您实现OnClickListener时,“this”是不同的。示例: class Example{ int number = 0; public Example(int number){

我在Android(以及Java)上的编程处于初级阶段。我知道活动继承自上下文类。然而,在我遇到的每个代码片段中,每次必须提及上下文时,它都被设置为“this”

我的问题是:什么时候上下文与“this”不同?你能提供一个真实生活的例子,说明上下文需要与“this”不同吗


非常感谢。

例如,当您实现OnClickListener时,“this”是不同的。

示例:

class Example{
    int number = 0;

    public Example(int number){
        this.number = number;
    }
}
请注意,构造函数中的数字和类中的数字是不同的。虽然他们有相同的名字。说数字=数字没有意义。如果你使用这个,你可以在班上计算数字

  • 在外部类中,您直接使用“this”引用
  • 在内部类或抽象类实现或接口实现中使用“classname.this”引用

  • 通常,当您在活动的“内部”时,您会希望使用
    。但是,当您使用例如Helper类时,引用
    this
    将不起作用。例如:

    public class MyActivity extends Activity
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        }
    }
    
    在这种情况下,您不能:

    public class MyHelper
    {
        /* some code of yours */
    
        public void lockOrientation(Activity activity)
        {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        }
    }
    
    上述代码将方向锁定为当前方向。请注意,您需要为该方法提供活动参数,因为您不能使用:

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
    
    在第一个示例中,您可以使用
    this
    来实现这一点,因为您“在”一个活动中

    另一种类型的示例是,如何设置
    onClickListener

    第一个示例,当您使用此时:

    public class MyActivity extends Activity implements View.OnClickListener
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            Button btn=(Button)findViewById(R.id.mybutton);
            btn.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v)
        {
            //handle the click event
        }
    }
    
    public class MyActivity extends Activity
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            Button btn=(Button)findViewById(R.id.mybutton);
            btn.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    //handle the click event
                }
            });
        }
    }
    
    在本例中,您可以使用
    this
    ,因为在第一行中,我们编写了
    implements View.OnClickListener
    ,因此类从给定接口继承。没有工具的东西,你就做不到。设置
    onClickListener
    而不使用
    this
    的示例:

    public class MyActivity extends Activity implements View.OnClickListener
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            Button btn=(Button)findViewById(R.id.mybutton);
            btn.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v)
        {
            //handle the click event
        }
    }
    
    public class MyActivity extends Activity
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            Button btn=(Button)findViewById(R.id.mybutton);
            btn.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    //handle the click event
                }
            });
        }
    }
    

    在第二个示例中,我们定义了一个
    匿名内部类
    ,它将处理按钮的单击事件。请注意,在本例中,我们的活动没有
    实现视图。OnClickListener
    这是对当前对象的引用,即调用其方法或构造函数的对象

    活动
    的方法中
    可以用作
    上下文
    对象,因为
    活动
    继承自
    ContextThemeWrapper
    ,它继承自
    上下文

    另一方面,
    片段
    不是从
    上下文继承的。因此,要在
    片段中获取
    上下文
    ,您必须调用
    getActivity()

    这适用于您从中调用此
    的任何对象

    假设您在
    视图的
    OnClick()
    方法中。OnClickListener
    并且您想启动
    活动

    button.setOnClickListener (new View.OnClickListener() {
        public void onClick(View v) {
    
            Intent intent = new Intent(this, NextActivity.class); // wrong because 'this' is the OnClickListener object
    
            Intent intent = new Intent(CurrentActivity.this, NextActivity.class); // correct because 'this' is the CurrentActivity object
    
            startActivity(intent);
        }
    });
    

    看看这在Java中是什么意思:是的,但您仍然键入“this”。我的问题是什么时候不键入“this”作为上下文。亨德瓦提供了一个答案。我很想找到其他的例子,如果有的话。在一个活动中,创建一个变量,上下文。然后,在onCreate方法上,您可以执行context=this,以后可以将该变量用于任何您想要的内容。@warm:在非活动类中,您不能使用“this”。。在活动课上,你可以使用“this”。。其余部分已在上面解释。谢谢,这回答了我的问题。我理解为什么在你的第二个例子中不使用“this”。您是否考虑过在活动中传递除“this”之外的另一个值作为上下文的另一种情况?您可以全局定义上下文变量为,context context=this;并使用变量“context”而不是“this”。请参阅另一个示例的更新答案。当你不能使用
    this
    时,会出现很多情况,但这两种情况比较容易理解。@android\u初学者在保存变量中的上下文时要小心,尤其是当它是静态变量时。您可能会弄乱垃圾收集器,导致严重的内存泄漏。除非你没有必要,否则尽量避免这种情况。:)贝尼托,虽然这是一个很好的信息,但它并不是我最终想要的(我的问题肯定格式不正确)。尽管您帮助澄清了不同“this”之间可能存在的混淆,但最终您提供的代码使用“this”作为上下文,我的问题是上下文何时与“this”不同。我确实理解您提供的信息,我对此表示感谢,但我的问题是,我们什么时候才能避免键入“this”作为上下文。