【问题标题】:Two Button OnClickListeners inside for loopfor循环内的两个按钮OnClickListener
【发布时间】:2012-08-15 08:26:12
【问题描述】:

我正在自学 Android,现在我正在学习如何使用按钮。我创建了一个简单的向上计数器,其工作原理如下: 我在不同的文本字段中添加字符串(例如 1 2 3)。然后我想成对比较它们(1 与 2、1 与 3、2 与 3)。第一个字符串元素写在第一个按钮上,第二个写在第二个按钮上,在我按下任何这些按钮后,按钮上的标签必须更改(如果有 1 和 2,那么它应该更改为 1 和 3 或 2 和3等)并且字符串元素获得更高的排名。一切似乎都运行良好,但我认为我在添加按钮时犯了很大的错误。谁能帮我? :) 我可以像在下面的代码中那样添加按钮侦听器吗? :) 谢谢!

public void counter() 
{
    int i = 0;
    int a = i + 1;

    for ( i = 0; i < candidates.size() - 1; i++ ) 
    {
            Log.d(TAG, "Setting button one tag: " + i );
            button_one.setTag(i);
            button_one.setText(candidates.get(i).name);

            for (a = i + 1; a < candidates.size(); a++)
            {
            Log.d(TAG, "Setting button two tag: " + a );
            button_two.setTag(a);
            button_two.setText(candidates.get(a).name);

            button_one.setOnClickListener(new View.OnClickListener() 
            {

                public void onClick(View view) {

                    /* Read the clicked tag */
                    int tag = (Integer) view.getTag();

                    /* Make higher rank */
                    candidates.get(tag).addRank();
                }
            });

            button_two.setOnClickListener(new View.OnClickListener() 
            {

                public void onClick(View view) {

                    /* Read the clicked tag */
                    int tag = (Integer) view.getTag();

                    /* Make higher rank */
                    candidates.get(tag).addRank();
                }
            }); 
            }       
    }

【问题讨论】:

    标签: android button android-button


    【解决方案1】:

    AndyRes 所说的一切,加上: 您正在创建 (candidates.size() * Candidates.size()) 数量的 OnClickListener 那是很多不必要的对象占用你的内存。

    你应该创建一个OnClickListener mListener = new View.OnClickListener etc... etc... 并且在循环之外,可能在您定义button_one = (Button)findViewById(R.id.button_one); 之后的OnCreate() 期间,您执行button_one.setOnClickListener(mListener);

    这样您就只有 1 个侦听器,可以为您可能拥有的任意数量的按钮提供服务,并且不需要再次设置同一个侦听器。

    【讨论】:

    • OnClickListener mListener 应该在循环内还是在循环外?
    • 外面。 OnClickListener mListener 应该是您正在实现的类的私有对象。你说你是自学的。在我看来,您来自非面向对象的背景(兄弟去过那里),这听起来有点像。如果这是正确的,我建议您在深入了解 Android 之前先阅读一些面向对象的知识。只是类/对象/实例化/等的基础知识
    【解决方案2】:

    通常不需要在循环中添加点击侦听器,除非您动态地创建这些按钮。

    在循环中为同一个按钮设置点击侦听器,每次循环循环时,只会覆盖以前的设置,所以我认为这样做没有任何意义。

    【讨论】:

    • 视情况而定。我说过,除非您以动态方式(从代码中)创建按钮,否则可以使用循环来设置点击侦听器。但是,如果您的 XML 布局中有 2 个按钮,并且想为它们设置点击监听器,那么在我获得对按钮 Button myButton=(Buttom)findViewById(...); 的引用之后,我将设置点击监听器 myButton.setOnClickListener(...);。不在循环内。
    • 只需设置监听器并在循环外覆盖onclick()方法即可。
    • 你的意思是我应该添加 button_one.setOnClickListener(new ButtonClicked()); button_two.setOnClickListener(new ButtonClicked());在循环内部,然后在计数器函数之外创建 ButtonClicked 类? :)
    • @JuozasA 不,我认为它不会起作用。而是使用 button_one.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { /* 读取点击的标签 / int tag = (Integer) view.getTag(); / 使更高排名 */ Candidates.get(tag).addRank(); } });循环外
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多