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

从内部类中访问变量需要声明为最终变量

穆仲卿
2023-03-14

我知道这个话题听起来像是重复的,但我并不是想在这里调试这个问题,而是想绕过它。

我的程序应该做的是:对于文件夹中的每个文件,创建一个新按钮。如果您单击此按钮,请输入您刚输入的文件夹的名称。

 File directory = new File(prefs.getString("path",null));
 File[] files = directory.listFiles();
        for (File file :files){
            if(file.isDirectory()) {
                buttons.add(new Button(this));
                Button button = buttons.get(buttons.size() - 1);
                String fileName = file.getName();

                button.setText(fileName);
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(currentActivity, EOChoiceActivity.class);
                        intent.putExtra("fileExtension",fileName);
                        startActivity(intent);
                    }
                });
                layout.addView(button);
            }
        }

现在我遇到的问题是,“fileName”变量需要放在final中,因为Java提供的是对象的指针,而不是值本身。但如果我这样做,则只会为任何按钮发送最后选择的文件名。

共有2个答案

邓浩漫
2023-03-14

无需声明文件名(final)。

因为您正在将fileName设置为Button的文本。因此使用getText使用v参数onClick以获取Button上的文件名click.like

...
intent.putExtra("fileExtension",((Buttton)v).getText().toString());
...

或者您也可以使用setTag()/getTag()按钮按钮的方法来执行此操作。

危阳
2023-03-14

您只需继续并将文件名设置为final即可。我知道你认为这会引起问题,但不会。

“fileName”变量需要放在最后,因为Java给出对象的指针而不是值本身。但是如果我这样做了,只会为任何按钮发送最后选择的文件名。

在循环的每次迭代中,您都声明了一个不同的字符串实例。每一个都是最终的,但它们不会在循环迭代中“共享”。

我制作了一个小应用程序,它迭代了一组字符串,做了一些与您的代码非常相似的事情。尽管将我的字符串声明为final,但当我单击每个按钮时,它仍会发出不同的名称。

for (int i = 0; i < names.length; i++) {
    final String name = names[i];

    Button button = new Button(this);
    button.setText(name);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();
        }
    });

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

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

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

  • 变量“适配器”和声明最终的问题。我的IDE一直在告诉“适配器”需要声明为最终,我在哪里以及如何做到这一点?这让我陷入停顿,我似乎无法继续前进。请帮助。它在这里参考了这段代码和问题:来自ListView的Android ImageView

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

  • 我在中发现了一个编译错误。 代码是这样的。