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());
                }
            });
        }
    }
}