[英]Curiosity about Usage of --> .this
我对 Android 和 Java 很陌生。 我对代码中this的用法有一些疑问。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent thePigeonsss = new Intent(this, SecondActivity.class);
}
void attachButtonListener(Button btn, final String theString) {
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent thePigeon = new Intent(this, SecondActivity.class);
thePigeon.putExtra(theString, theString);
}
});
}
上面是我的代码片段。 我不明白的是attachButtonListener
的 Intent 构造attachButtonListener
。 意图构造函数中存在一些错误,原因是解析意图构造函数出错。 但是在我用MainActivity.this
替换 attachButtonListener 中的 this 之后,错误就消失了。 我试图阅读 Android 文档,它说它应该是 Intent 构造函数中的上下文。
谁能向我解释为什么我必须使用MainActivity.this
而不是this
? 我也对我现在所说的感到困惑。 是不是因为 Context 不存在于这个函数中而它存在于onCreate
函数中是因为 Context 是用super.onCreate
创建的?
在源代码中:
public Intent(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
}
this
意味着您的代码中的View.OnClickListener()
。
我们需要MainActivity.this
作为Context
改成这样:
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent thePigeon = new Intent(YourActivity.this, SecondActivity.class);
thePigeon.putExtra(theString, theString);
}
});
Intent 构造函数需要两个参数Intent(context, class)
和 this 关键字指的是当前对象。 所以,
void attachButtonListener(Button btn, final String theString) {
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent thePigeon = new Intent(this, SecondActivity.class);
thePigeon.putExtra(theString, theString);
}
});
}
在上面的意图中, this
是指点击侦听器的匿名类,它不是从 Activity/Fragment 扩展的,因为它没有上下文。 所以,如果你做MainActivity.this
这将引用具有上下文的 MainActivity 类。
为什么我必须使用 MainActivity.this 而不是 this?
答案是范围。
“ this
”指的是方法正在执行的对象。 新intent
的“上下文”由Activity
提供。 但是创建新意图的位置是在View.OnClickListener
类的匿名对象内,该对象包含在 Activity 的实例中。
从匿名对象内部,您可以使用类名称前面的“this”来引用封装对象的实例。
在这种情况下MainActivity.this
通过这种方式,您可以掌握创建意图所需的“上下文”。
有两种类型的上下文:
应用程序上下文与应用程序相关联,并且在应用程序的整个生命周期中始终相同——它不会改变。 因此,如果您使用 Toast,您可以使用应用程序上下文甚至活动上下文(两者),因为 Toast 可以在您的应用程序中的任何位置显示,并且不附加到特定窗口。 但是有很多例外,一种例外是当您需要使用或传递活动上下文时。
活动上下文与活动相关联,如果活动被破坏,则可以被破坏——单个应用程序可能有多个活动(很可能)。 有时您绝对需要活动上下文句柄。 例如,如果您启动一个新活动,您需要在其 Intent 中使用活动上下文,以便新启动的活动在活动堆栈方面连接到当前活动。 但是,您也可以使用应用程序的上下文来启动新活动,但是您需要设置标志Intent.FLAG_ACTIVITY_NEW_TASK
以将其视为新任务。
让我们考虑一些情况:
MainActivity.this
指的是扩展Activity类的MainActivity上下文,但基类(activity)也扩展了Context类,因此可以用来提供Activity上下文。
getBaseContext()
提供活动上下文。
getApplication()
提供应用程序上下文。
getApplicationContext()
还提供应用程序上下文。
如果您使用,这指的是当前上下文Intent thePigeonsss = new Intent(this, SecondActivity.class);
意向构造函数需要您的MainActivity的情况下使上述线路工作正常,如果你想在你的onClickListner使用此那么上面的线,然后this
将指向View.OnClickListener()
所以你必须指定其意图的构造并不需要MainActivity.this 指向引用您的 MainActivity 的上下文。 所以在你的 onClickListner 你必须把这一行
Intent thePigeonsss = new Intent(MainActivity.this, SecondActivity.class);
您必须指定采用 MainActivity 上下文的 Intent 构造函数
从文档:
在实例方法或构造函数中, this 是对当前对象的引用——正在调用其方法或构造函数的对象。 您可以使用 this 从实例方法或构造函数中引用当前对象的任何成员。
当您使用以下代码时:
void attachButtonListener(Button btn, final String theString) {
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent thePigeon = new Intent(this, SecondActivity.class);
thePigeon.putExtra(theString, theString);
}
});
}
this
将引用View.OnClickListener()
,它是this
所在的对象。
因此,您需要使用 MainActivity.this 来引用 MainActivity 的对象。 您需要通过以下方式更改您的意图创建:
Intent thePigeon = new Intent(MainActivity.this, SecondActivity.class);
this 可用于引用当前类实例变量。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent thePigeonsss = new Intent(this, SecondActivity.class);
}
在上面的代码中, this
指的是主活动对象,因此当您在参数中传递 this 时,它属于主活动。
void attachButtonListener(Button btn, final String theString) {
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent thePigeon = new Intent(this, SecondActivity.class);
thePigeon.putExtra(theString, theString);
}
});
}
但是当您在按钮单击侦听器中使用 this 时,这表示当前接口没有任何可用上下文,并且编译器正在生成错误,但是当您传递MainActivity.this
,它将从活动类中获取上下文,因此错误是走了。
您还可以使用view.getContext()
而不是MainActivity.this
如果你不想使用MainActivity.this但最好是使用MainActivity.this启动任何新的活动。
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent thePigeon = new Intent(view.getContext(), SecondActivity.class);
thePigeon.putExtra(theString, theString);
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.