从内部类内部访问变量需要声明为final

Tho*_*mas 2 android

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

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

 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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

Ben*_* P. 5

你可以继续做fileName最后的事情。我知道您认为这会引起问题,但事实并非如此。

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

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

我制作了一个小型应用程序,它迭代 s 数组String,执行与您的代码非常相似的操作。尽管声明了我的Stringas 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);
}
Run Code Online (Sandbox Code Playgroud)