Context 和 MainActivity.this 有区别吗?
Are Context and MainActivity.this different?
在MainActivity中,Context
和MainActivity
有区别吗?
它们正好是方法中的getApplicationContext()
和MainActivity.this
。
我问这个的原因是因为他们让我出错了。
如果这些不同,编译器不会在代码中显示红线。
我一直以为到现在都是一样的。
我得到了这个错误代码。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.writeweight, PID: 24595
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:843)
at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:806)
at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:693)
at androidx.appcompat.app.AppCompatDialog.setContentView(AppCompatDialog.java:95)
at androidx.appcompat.app.AlertController.installContent(AlertController.java:232)
at androidx.appcompat.app.AlertDialog.onCreate(AlertDialog.java:279)
at android.app.Dialog.dispatchOnCreate(Dialog.java:702)
at android.app.Dialog.show(Dialog.java:424)
at com.example.writeweight.MainActivity.onOptionsItemSelected(MainActivity.java:85)
at android.app.Activity.onMenuItemSelected(Activity.java:4182)
然后我从 getApplicationContext()
更改为 MainActivity.this
,效果很好。
代码
MainActivity.class
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); // HERE
builder.setTitle("SET");
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),"TEST", Toast.LENGTH_SHORT).show();
}
});
AlertDialog dialog = builder.create();
dialog.show();
return true;
}
请告诉我。
谢谢
getApplicationContext()
(有点不足为奇)returns 应用程序上下文,而 MainActivity.this
本身就是一个 activity 上下文。与您的 activity 相关的主题将与您的应用程序不同。它们不是一回事。
if these are different, Complier didn't display red line in code.
您不会看到错误,因为请求的只是 Context
。我没试过,但你可能可以使用 Application
实例,只要你 specify the theme 也可以使用 new AlertDialog.Builder(getApplicationContext(), /* theme res id */)
但是,Android documentation 中的所有示例都使用了 Activity 上下文,因此我建议您使用它。
在MainActivity中,Context
和MainActivity
有区别吗?
它们正好是方法中的getApplicationContext()
和MainActivity.this
。
我问这个的原因是因为他们让我出错了。
如果这些不同,编译器不会在代码中显示红线。
我一直以为到现在都是一样的。
我得到了这个错误代码。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.writeweight, PID: 24595
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:843)
at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:806)
at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:693)
at androidx.appcompat.app.AppCompatDialog.setContentView(AppCompatDialog.java:95)
at androidx.appcompat.app.AlertController.installContent(AlertController.java:232)
at androidx.appcompat.app.AlertDialog.onCreate(AlertDialog.java:279)
at android.app.Dialog.dispatchOnCreate(Dialog.java:702)
at android.app.Dialog.show(Dialog.java:424)
at com.example.writeweight.MainActivity.onOptionsItemSelected(MainActivity.java:85)
at android.app.Activity.onMenuItemSelected(Activity.java:4182)
然后我从 getApplicationContext()
更改为 MainActivity.this
,效果很好。
代码
MainActivity.class
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); // HERE
builder.setTitle("SET");
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),"TEST", Toast.LENGTH_SHORT).show();
}
});
AlertDialog dialog = builder.create();
dialog.show();
return true;
}
请告诉我。 谢谢
getApplicationContext()
(有点不足为奇)returns 应用程序上下文,而 MainActivity.this
本身就是一个 activity 上下文。与您的 activity 相关的主题将与您的应用程序不同。它们不是一回事。
if these are different, Complier didn't display red line in code.
您不会看到错误,因为请求的只是 Context
。我没试过,但你可能可以使用 Application
实例,只要你 specify the theme 也可以使用 new AlertDialog.Builder(getApplicationContext(), /* theme res id */)
但是,Android documentation 中的所有示例都使用了 Activity 上下文,因此我建议您使用它。