For循环多个按钮和字符串:如果单击另一个按钮,如何更改按钮文本和背景并恢复为默认设置?

Posted

技术标签:

【中文标题】For循环多个按钮和字符串:如果单击另一个按钮,如何更改按钮文本和背景并恢复为默认设置?【英文标题】:For loops multiple buttons and strings : how to change button text and background and to restore to default settings, if another button is clicked? 【发布时间】:2021-07-21 19:25:00 【问题描述】:

找到解决方案!查看更新!

我到处寻找解决方案,但找不到满意的答案。

我有 100 个带有默认布局和文本的按钮。我正在寻找的是一种简单、简单的方法/解决方案,当按下按钮 1 以更改其文本和背景以及按下按钮 2 以更改其自己的文本和背景但按钮 1 应返回其先前/默认设置和其他按钮也是如此。

我有办法做到这一点,但由于我还有 500 个其他按钮,所以我需要很长时间才能编写所有这些按钮,并且我也希望保持我的代码简短。

下面是我现在使用的代码,希望对大家有所帮助。谢谢!

btn1.setOnClickListener(new View.OnClickListener() 
            public void onClick(View v) 

      
            String sometext = "<b>sometext</b>";
            btn1.setText(html.fromHtml(sometext), Button.BufferType.SPANNABLE);
            btn1.setTextColor(Color.YELLOW);
            btn1.setBackgroundResource(R.drawable.grey);

            btn2.setText(getString(R.string.todeaulttext));
            btn2.setTextColor(Color.WHITE);
            btn2.setBackgroundResource(R.drawable.purple);

            btn3.setText(getString(R.string.todefaulttext));
            btn3.setTextColor(Color.WHITE);
            btn3.setBackgroundResource(R.drawable.purple);

btn2.setOnClickListener(new View.OnClickListener() 
            public void onClick(View v) 

            String   someothertext= "<b>someothertext</b>";
            btn2.setText(Html.fromHtml(someothertext), Button.BufferType.SPANNABLE);
            btn2.setTextColor(Color.YELLOW);
            btn2.setBackgroundResource(R.drawable.grey);

            btn1.setText(getString(R.string.todeaulttext));
            btn1.setTextColor(Color.WHITE);
            btn1.setBackgroundResource(R.drawable.purple);
         
            btn3.getResources().getString(R.string.todeaulttext);
            btn3.setTextColor(Color.WHITE);
            btn3.setBackgroundResource(R.drawable.purple);

更新:找到了使用嵌套 for 循环测试我的问题的解决方案,它就像一个魅力。

first for loop = 将 onclickListeners 设置为所有按钮。

第二个循环 = 为所有按钮定义文本颜色和背景。

第三个循环 = 为每个按钮设置按钮文本(字符串)。

使用 if 语句 = 的第四个循环在单击按钮时更改文本颜色和背景。仅更改正在单击的按钮文本颜色和背景。

if 语句中的第五个循环 = 仅更改单击按钮的文本(字符串)。

我希望这对其他有类似问题的人有用

for (int i1 = 0; i1

            buttons[i1] = findViewById(Array[i1]);
            Button btn1 = findViewById(Array[i1]);
            int finalI1 = i1;
            int finalI = i1;

            buttons[i1].setOnClickListener(v16 -> 

                for (int j = 0; j < Array.length; j++) 
                    buttons[j] = findViewById(Array[j]);
                    Button btn = findViewById(Array[j]);
                    btn.setTextColor(Color.WHITE);
                    btn.setBackgroundResource(R.drawable.purple);

                    String[] stringArray = getResources().getStringArray(R.array.somestrings);

                    for (int k = 0; k < stringArray.length; k++) 
                        buttons[k] = findViewById(Array[k]);
                        Button btn2 = findViewById(Array[k]);
                        btn2.setText(stringArray[k]);
                    

                    int id = btn1.getId();
                    if (id == Array[finalI1]) 

                        for (int l = 0; l < Array.length; l++) 
                            buttons[l] = findViewById(verbsArray[l]);
                            btn1.setTextColor(Color.YELLOW);
                            btn1.setBackgroundResource(R.drawable.grey);
                        

                        if (id == Array[finalI]) 

                            String[] stringArray1 = getResources().getStringArray(R.array.someotherstring);
                           
                           btn1.setText(stringArray1[finalI]);
                        
                    
                
            );
        

【问题讨论】:

【参考方案1】:

一种方法可能是 - 如果所有按钮都是动态创建的,则将它们全部保存在 List 中,以编程方式为每个按钮分配唯一的 Id(通过使用 setId/setTag)。在单击侦听器中,将单击的视图 ID 与按钮 ID 列表进行比较并执行所需的操作。

下面是一个工作示例代码供参考:

class MainActivity : AppCompatActivity() ,View.OnClickListener

private lateinit var linearLayout: LinearLayout

private val NUM_BUTTONS :Int = 10

private var buttonList = ArrayList<Button>()

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    linearLayout = findViewById(R.id.linearLayout)

   for( i in 1..NUM_BUTTONS)
       val button = Button(this)
       button.id= i
       button.tag = i
       button.text = "button " + i.toString()
       button.setOnClickListener(this)
       buttonList.add(button)
       linearLayout.addView(button)
   


override fun onClick(view: View) 
    for( button in buttonList)
        if(button.id == view.id)
            button.text = "Clicked Me"
        else
            button.text = "Un Click All"
        
    

xml 布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:id="@+id/linearLayout">
</LinearLayout>

【讨论】:

thnx 我不知道如何实现这个,因为我不熟悉 kotlin。我确实找到了一个更简单的解决方案,而且您提供的 for 循环似乎比我发现的更短。 switch(v.getId()) case R.id.btn: if (btn!= null) String sometext= "text"; btn.setText(Html.fromHtml(sometext), Button.BufferType.SPANNABLE); btn.setTextColor(Color.YELLOW); btn.setBackgroundResource(R.drawable.grey); 休息;

以上是关于For循环多个按钮和字符串:如果单击另一个按钮,如何更改按钮文本和背景并恢复为默认设置?的主要内容,如果未能解决你的问题,请参考以下文章

通过单击按钮循环浏览 Jlabel 的图像时的 for 循环问题

如何在for循环中切换单击按钮的类?

如何为后退按钮保留 Web 表单内容

如何用javascript连续点击多个按钮?

使用 Python 和 Selenium 按文本单击按钮

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始