Android Java: 在 for 循环中使用 setOnClickListener
Android Java: Using setOnClickListener in for loop
我正处于 android 开发的早期阶段,我遇到了 for
循环的问题。
这是我的代码:
for (int i=0; i<=30; i++){
tableRows[i] = new TableRow(this);
tableRows[i].setId(i);
tableRows[i].setLayoutParams(tableRowParams);
tableRows[i].setBackgroundResource(R.drawable.bg);
textViews1[i] = new TextView(this);
textViews1[i].setText("Eng Kelime " + i);
textViews1[i].setTextSize(25);
textViews1[i].setTextColor(Color.WHITE);
textViews1[i].setId(i);
textViews1[i].setPadding(20, 30, 0, 0);
textViews1[i].setLayoutParams(Params2);
tableRows[i].addView(textViews1[i]);
textViews2[i] = new TextView(this);
textViews2[i].setText("Tr Kelime " + i);
textViews2[i].setTextSize(25);
textViews2[i].setTextColor(Color.WHITE);
textViews2[i].setId(i);
textViews2[i].setPadding(30,30,0,0);
textViews2[i].setLayoutParams(Params2);
tableRows[i].addView(textViews2[i]);
tableLayout.addView(tableRows[i]);
textViews1[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//These textViews[i] veriables need to be declared final.
//But I don't know how!..
if (textViews2[i].getVisibility() == View.VISIBLE) {
textViews2[i].setVisibility(View.INVISIBLE);
}else{
textViews2[i].setVisibility(View.VISIBLE);
}
}
});
}
我有 TableRows
和每个 TableRows
中的两个 textViews
。当我单击第一个 textView1[i]
时,第二个 textView2[i]
将不可见或可见。
但是在 setOnClickListener
代码块中我有 "variable 'i' is accessed from within inner class needs to be declared final" 错误代码。
我已将 i
声明为 final
,如 for(final int i=0; i<=30; i++)
。然后我有一个不同的错误。 "Variable 'i' Can not be declared final"
为了从内部 class 访问局部变量,必须声明它 final
,因此不能在外部更改。你可以通过使用一个额外的虚拟变量来做到这一点:
final index = i; // here!
textViews1[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (textViews2[index].getVisibility() == View.VISIBLE) {
textViews2[index].setVisibility(View.INVISIBLE);
}else{
textViews2[index].setVisibility(View.VISIBLE);
}
}
});
声明一个新变量 j
并将您的代码修改为:
final int j = i;
textViews1[j].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (textViews2[j].getVisibility() == View.VISIBLE) {
textViews2[j].setVisibility(View.INVISIBLE);
}else{
textViews2[j].setVisibility(View.VISIBLE);
}
}
});
试试这个。这会起作用。
试试这个:
final TextView txtToToggle = textViews2[i];
textViews1[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (txtToToggle.getVisibility() == View.VISIBLE) {
txtToToggle.setVisibility(View.INVISIBLE);
} else {
txtToToggle.setVisibility(View.VISIBLE);
}
}
});
I have declered "i" as final like "for(final int i=0; i<=30; i++)". Then I had > a different error. "Veriable 'i' Can not be declared final"
将 i 声明为最终值意味着您无法更改 i 的值。因此,i++ 是无效的。您不能在 for 循环中将 i 声明为 final。
一种解决方法是创建一个新变量,例如 j,并将其赋值 i。在内部 class 中,使用 j 而不是 @ZygoteInit 所述的 i。
我在 Java 中使用 JMenuItem 为您提供了一个非常简单的技巧,但您也可以为您的项目做同样的事情:
package tests;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class MyMenu extends JMenuBar {
private ArrayList<String> list = new ArrayList<String>();
private JMenu menu = new JMenu("Menu");
private ArrayList<JMenuItem> jMenus = new ArrayList<JMenuItem>();
public MyMenu() {
populateMenu();
createMenu();
createAction();
}
private void populateMenu(){
for (int i = 0; i < 3; i++) {
list.add("Object "+i);
}
}
private void createMenu(){
for (int i = 0; i < list.size(); i++) {
JMenuItem item = new JMenuItem(list.get(i));
jMenus.add(item);
menu.add(item);
}
add(menu);
}
private void createAction(){
for (int i = 0; i < jMenus.size(); i++) {
final int index = i;
jMenus.get(i).addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(jMenus.get(index).getText());
}
});
}
}
}
我正处于 android 开发的早期阶段,我遇到了 for
循环的问题。
这是我的代码:
for (int i=0; i<=30; i++){
tableRows[i] = new TableRow(this);
tableRows[i].setId(i);
tableRows[i].setLayoutParams(tableRowParams);
tableRows[i].setBackgroundResource(R.drawable.bg);
textViews1[i] = new TextView(this);
textViews1[i].setText("Eng Kelime " + i);
textViews1[i].setTextSize(25);
textViews1[i].setTextColor(Color.WHITE);
textViews1[i].setId(i);
textViews1[i].setPadding(20, 30, 0, 0);
textViews1[i].setLayoutParams(Params2);
tableRows[i].addView(textViews1[i]);
textViews2[i] = new TextView(this);
textViews2[i].setText("Tr Kelime " + i);
textViews2[i].setTextSize(25);
textViews2[i].setTextColor(Color.WHITE);
textViews2[i].setId(i);
textViews2[i].setPadding(30,30,0,0);
textViews2[i].setLayoutParams(Params2);
tableRows[i].addView(textViews2[i]);
tableLayout.addView(tableRows[i]);
textViews1[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//These textViews[i] veriables need to be declared final.
//But I don't know how!..
if (textViews2[i].getVisibility() == View.VISIBLE) {
textViews2[i].setVisibility(View.INVISIBLE);
}else{
textViews2[i].setVisibility(View.VISIBLE);
}
}
});
}
我有 TableRows
和每个 TableRows
中的两个 textViews
。当我单击第一个 textView1[i]
时,第二个 textView2[i]
将不可见或可见。
但是在 setOnClickListener
代码块中我有 "variable 'i' is accessed from within inner class needs to be declared final" 错误代码。
我已将 i
声明为 final
,如 for(final int i=0; i<=30; i++)
。然后我有一个不同的错误。 "Variable 'i' Can not be declared final"
为了从内部 class 访问局部变量,必须声明它 final
,因此不能在外部更改。你可以通过使用一个额外的虚拟变量来做到这一点:
final index = i; // here!
textViews1[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (textViews2[index].getVisibility() == View.VISIBLE) {
textViews2[index].setVisibility(View.INVISIBLE);
}else{
textViews2[index].setVisibility(View.VISIBLE);
}
}
});
声明一个新变量 j
并将您的代码修改为:
final int j = i;
textViews1[j].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (textViews2[j].getVisibility() == View.VISIBLE) {
textViews2[j].setVisibility(View.INVISIBLE);
}else{
textViews2[j].setVisibility(View.VISIBLE);
}
}
});
试试这个。这会起作用。
试试这个:
final TextView txtToToggle = textViews2[i];
textViews1[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (txtToToggle.getVisibility() == View.VISIBLE) {
txtToToggle.setVisibility(View.INVISIBLE);
} else {
txtToToggle.setVisibility(View.VISIBLE);
}
}
});
I have declered "i" as final like "for(final int i=0; i<=30; i++)". Then I had > a different error. "Veriable 'i' Can not be declared final"
将 i 声明为最终值意味着您无法更改 i 的值。因此,i++ 是无效的。您不能在 for 循环中将 i 声明为 final。
一种解决方法是创建一个新变量,例如 j,并将其赋值 i。在内部 class 中,使用 j 而不是 @ZygoteInit 所述的 i。
我在 Java 中使用 JMenuItem 为您提供了一个非常简单的技巧,但您也可以为您的项目做同样的事情:
package tests;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class MyMenu extends JMenuBar {
private ArrayList<String> list = new ArrayList<String>();
private JMenu menu = new JMenu("Menu");
private ArrayList<JMenuItem> jMenus = new ArrayList<JMenuItem>();
public MyMenu() {
populateMenu();
createMenu();
createAction();
}
private void populateMenu(){
for (int i = 0; i < 3; i++) {
list.add("Object "+i);
}
}
private void createMenu(){
for (int i = 0; i < list.size(); i++) {
JMenuItem item = new JMenuItem(list.get(i));
jMenus.add(item);
menu.add(item);
}
add(menu);
}
private void createAction(){
for (int i = 0; i < jMenus.size(); i++) {
final int index = i;
jMenus.get(i).addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(jMenus.get(index).getText());
}
});
}
}
}