gpt4 book ai didi

android - 从内部类中访问的变量需要声明为final

转载 作者:太空狗 更新时间:2023-10-29 16:27:24 24 4
gpt4 key购买 nike

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

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

 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 给出了对象的指针而不是值本身。但如果我这样做,则只会为任何按钮发送最后选择的文件名。

最佳答案

您可以继续将 fileName 设为最终文件。我知道您认为这会导致问题,但事实并非如此。

the "fileName" variable needs to be put in final, due to Java giving the pointer of the object and not the value itself. But if I do so, only the last fileName selected will be sent for any button.

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

我制作了一个小型应用程序,它遍历 String 数组,执行与您的代码非常相似的操作。尽管将我的 String 声明为 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);
}

关于android - 从内部类中访问的变量需要声明为final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47207564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com