【问题标题】:Variable (dialogView) is accessed from within inner class, needs to be declared final从内部类中访问变量(dialogView),需要声明为final
【发布时间】:2018-07-13 17:20:47
【问题描述】:

我正在尝试创建一个布局为“是”或“否”的警报对话框。我想通过单击“否”按钮来关闭该对话框,但 dialogView.dismiss(); 出现错误。

这是我的代码。

private void showCancelOrderDialog() {

AlertDialog.Builder builder = new AlertDialog.Builder(context);

    LayoutInflater inflater = this.getLayoutInflater();
    View dialogView = inflater.inflate(R.layout.dialog_details_cancel_order, null);
    builder.setView(dialogView);


    ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.WHITE);
    SpannableStringBuilder ssBuilder = new SpannableStringBuilder(db_title);
    ssBuilder.setSpan(foregroundColorSpan,0,db_title.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    builder.setTitle(ssBuilder);

    yes = dialogView.findViewById(R.id.btn_yes);
    yes.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            ////////////////////////////
        }
    });
    no = dialogView.findViewById(R.id.btn_no);
    no.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialogView.dismiss();
        }
    });
    AlertDialog alertDialog = builder.create();
    alertDialog.show();
}

【问题讨论】:

  • 您在下方包含感谢的回答已被删除。要感谢帮助过您的人,您可以给他们投票(感谢他们的努力或正确性),对于您认为最有帮助的答案,您可以通过单击该答案左侧的勾号来接受该答案。这样做会将问题标记为已解决,并为帮助者提供一些额外的积分,使其成为社区中有价值的成员。

标签: java android xml android-layout android-studio


【解决方案1】:

从此更改您对dialogView 的定义:

View dialogView = inflater.inflate(R.layout.dialog_details_cancel_order, null);

...到这个:

final View dialogView = inflater.inflate(R.layout.dialog_details_cancel_order, null);

dialogView 的原因有两种方法:一种是托管整个 sn-p,另一种是在匿名 View.OnClickListener 类中的onClick

如果两个方法看到相同的局部变量,Java 会希望你将其设为 final。有效地排除了该字段在未来被更改的可能性。

加上不存在引用参数,此规则确保局部变量仅在它们所属的方法中分配。代码因此更具可读性。

【讨论】:

    【解决方案2】:

    @Hadi Satrio 是对的。由于您已在本地分配 View 类的实例并从侦听器访问,因此您需要将其声明为 final。如果你不想让它成为最终的,你可以将它定义为全局变量。如果您想了解更多详细信息,请使用此链接。 Variable is accessed within inner class. Needs to be declared final

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 1970-01-01
      • 2015-07-24
      • 2016-10-11
      • 1970-01-01
      • 2016-03-18
      • 2015-02-17
      • 1970-01-01
      相关资源
      最近更新 更多