当前位置: 首页 > 知识库问答 >
问题:

变量(dialogView)是从内部类访问的,需要声明为final

越高峻
2023-03-14

我正在尝试创建一个布局为“是”或“否”的警报对话框。我想通过单击“否”按钮而不是对话框视图来关闭该对话框。Disclose() 有错误。

这是我的密码。

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();
}

共有2个答案

唐俊爽
2023-03-14

@哈迪·萨特里奥是对的。由于您已经在本地分配了视图类的实例并从侦听器进行访问,所以需要将其声明为final。如果不想使其成为最终变量,可以将其定义为全局变量。如果您想了解更多详细信息,请使用此链接。在内部类中访问变量。需要宣布为最终

宋飞文
2023-03-14

从以下位置更改您对对话视图的定义:

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

...对此:

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

原因有两种:一种是托管整个代码段的方法,另一种是匿名视图中的onClick。OnClickListener类。

如果两个方法看到相同的局部变量,Java希望您将其设置为final。有效地排除了该领域未来发生变化的可能性。

加上没有按引用参数,此规则确保局部变量仅在其所属的方法中指定。因此,代码更具可读性。

 类似资料:
  • 我已经签出了答案,比如变量是在内部类中访问的。需要被宣布为最终,但它没有解决我想要的。 我正在使用GraphView绘制从Google Firebase检索到的数据。数据应该是如下所示的连续线: 但当我运行程序时,它却是这样进行的: 我应该做些什么来解决这个问题?任何形式的帮助都将不胜感激。谢谢!

  • 我知道这个话题听起来像是重复的,但我并不是想在这里调试这个问题,而是想绕过它。 我的程序应该做的是:对于文件夹中的每个文件,创建一个新按钮。如果您单击此按钮,请输入您刚输入的文件夹的名称。 现在我遇到的问题是,“fileName”变量需要放在final中,因为Java提供的是对象的指针,而不是值本身。但如果我这样做,则只会为任何按钮发送最后选择的文件名。

  • 我的代码有上述错误。我尝试通过将我的btnsav声明为最终版本来修复此问题,但随后我收到另外两个错误: 未知类:“btnsave” 不是一个声明 你知道我如何修复这个错误吗?

  • 我得到了一个问题,对内部类的局部变量访问需要声明为final。从方法createGrids()->“”中,i是一个需要声明为final的局部变量。我不知道为什么,我在字段中添加了final,但它并不起作用。 //略

  • 问题内容: 尝试在内部类内部使用一个类的本地成员时遇到此错误。我知道将其声明为final将解决此问题,但我读到Java 8应该自动处理它,因为我将Intellij与Java 8一起使用,但它仍然无法编译。还有其他方法可以在不将其声明为final的情况下进行修复吗?谢谢。 问题答案: 我知道将其声明为final将解决此问题,但我读到Java 8应该自动处理它。 如果变量 有效地为final ,则Ja

  • 我正在尝试让一个按钮将其值与其他变量进行比较。在onClick方法中,我收到一个错误,说变量在内部类中被访问,需要声明为最终变量。问题是变量应该被更改,所以我无法使其成为最终变量。我如何解决这个问题?这是我的代码: