Context 和 MainActivity.this 有区别吗?

问题描述

在 MainActivity 中,ContextMainActivity 是不同的吗?

它们在 Method 中正好是 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()(不出所料)返回应用程序上下文,而 MainActivity.this 本身就是一个活动上下文。与您的活动相关的主题将与您的应用程序不同。它们不是一回事。

如果这些不同,编译器不会在代码中显示红线。

您不会看到错误,因为它只是请求一个 Context。我还没有尝试过,但您可能可以使用 Application 实例,只要您 specify the theme 也可以使用 new AlertDialog.Builder(getApplicationContext(),/* theme res id */)

但是,Android documentation 中的所有示例都使用 Activity 上下文,因此我建议您直接使用它。