Java 如何为onclick侦听器获取正确的上下文?

Java 如何为onclick侦听器获取正确的上下文?,java,android,Java,Android,当用户使用以下代码单击LinearLayout时,我尝试打开一个自定义对话框: each_pays = (TextView) findViewById(R.id.each_pays); each_pays_vert.setOnClickListener(new LinearLayout.OnClickListener() { @Override public void onClick(View _v) { // custo

当用户使用以下代码单击LinearLayout时,我尝试打开一个自定义对话框:

    each_pays = (TextView) findViewById(R.id.each_pays);

    each_pays_vert.setOnClickListener(new LinearLayout.OnClickListener() {
        @Override
        public void onClick(View _v) {
            // custom dialog
            final Dialog multiples_dialog = new Dialog(this);
            multiples_dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            multiples_dialog.setContentView(R.layout.multiples_dialog);

            Button closeMultiplesDialogButton = (Button) multiples_dialog.findViewById(R.id.close_multiples_button);
            // if button is clicked, close the custom dialog
            closeMultiplesDialogButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    multiples_dialog.dismiss();
                }
            });

            multiples_dialog.show();
        }
    });
例如,当从选项菜单项单击运行时,自定义对话框代码etc在其他地方工作,但当我在此处尝试时,会出现编译时错误:303、71错误:不兼容类型:无法将意图转换为上下文

错误在以下行中:

final Dialog multiples_dialog = new Dialog(this);
如果我用getApplicationContext替换它,就会出现运行时崩溃


我很困惑。

您的声明在一个对象声明中。因此,在本例中,这不是您的活动,而是OnClickListener

三种解决方案:

例如,使用final Dialog multiples\u Dialog=new dialogmain activity.this引用活动 将显示对话框的代码放在活动中的单独函数中,并在OnClickListener中调用该函数。 保存对要在OnClickListener中使用的上下文的引用,将其标记为final。此选项的外观如下所示: "

注意:应用程序上下文不能用于任何UI操作。这就是使用getApplicationContext时崩溃的原因。

您可以使用以下命令从视图中获取上下文:

我使用了第一个选项MainActivity.this作为快速修复,但一旦我有机会重新编写一些代码,我可能会通过您的第二个建议来实现,因为这看起来更“正确”,而不是快速修复。
each_pays = (TextView) findViewById(R.id.each_pays);
final Context ctx = this;
each_pays_vert.setOnClickListener(new LinearLayout.OnClickListener() {
    @Override
    public void onClick(View _v) {
        // custom dialog
        final Dialog multiples_dialog = new Dialog(ctx);
        ...
final Dialog multiples_dialog = new Dialog(_v.getContext());