Java 在安卓系统中,什么时候上下文不同于;这是什么;?
我在Android(以及Java)上的编程处于初级阶段。我知道活动继承自上下文类。然而,在我遇到的每个代码片段中,每次必须提及上下文时,它都被设置为“this” 我的问题是:什么时候上下文与“this”不同?你能提供一个真实生活的例子,说明上下文需要与“this”不同吗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){
非常感谢。例如,当您实现OnClickListener时,“this”是不同的。示例:
class Example{
int number = 0;
public Example(int number){
this.number = number;
}
}
请注意,构造函数中的数字和类中的数字是不同的。虽然他们有相同的名字。说数字=数字没有意义。如果你使用这个,你可以在班上计算数字
通常,当您在活动的“内部”时,您会希望使用
此
。但是,当您使用例如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”作为上下文。