如何为OnClickListener获取正确的上下文?

时间:2017-09-03 20:40:56

标签: java android

当用户使用以下代码点击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();
        }
    });

自定义对话框代码等在别处工作(例如,从选项菜单项单击运行时),但是当我在这里尝试时,我得到编译时错误Error:(303, 71) error: incompatible types: Intent cannot be converted to Context

错误在于:

final Dialog multiples_dialog = new Dialog(this);

如果我将this替换为getApplicationContext(),我会遇到运行时崩溃。

我很困惑。

2 个答案:

答案 0 :(得分:1)

您的声明属于对象声明(OnClickListener)。因此this在这种情况下不是您的活动,而是OnClickListener。

可以解决的三个选项:

  • final Dialog multiples_dialog = new Dialog(MainActivity.this)
  • 为例引用该活动
  • 将代码显示在Activity中的单独函数中,并在OnClickListener中调用该函数。
  • 保存对OnClickListener中使用的Context的引用(将其标记为final)。此选项看起来像这样:

'

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);
        ...

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

答案 1 :(得分:0)

您可以使用getContext()Context获得View

final Dialog multiples_dialog = new Dialog(_v.getContext());