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

时间:2017-11-09 16:57:16

标签: android

我知道这个主题听起来像是一个复杂的,但我不是试图在这里调试这个问题,而是为了解决这个问题。

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

0   0

340 17

580 29

700 35

900 45

1200    60

1420    71

1600    80

1800    90

2020    101

2200    110


2340    117

2520    126

2620    131

2820    141

3000    150

3220    161

3360    168

现在我遇到的问题是" fileName"由于Java给出了对象的指针而不是值本身,因此需要将变量置于最终。但是,如果我这样做,则只会为任何按钮发送最后选择的fileName。

2 个答案:

答案 0 :(得分:2)

无需声明fileName final

因为您要将fileName设置为按钮的文本。因此,使用getText使用v参数onClick来获取Button click.like上的文件名。

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

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

答案 1 :(得分:2)

你可以继续进行fileName决赛。我知道你认为这会导致问题,但事实并非如此。

  由于Java提供了对象的指针而不是值本身,因此需要将“fileName”变量置于最终中。但是,如果我这样做,则只会为任何按钮发送最后选择的fileName。

在循环的每次迭代中,您将声明一个不同的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);
}