android怎么用for循环给多个button按钮赋相同的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android怎么用for循环给多个button按钮赋相同的值相关的知识,希望对你有一定的参考价值。

在xml有25个button,id分别为button1,...,25,现在我需要对这个25个button赋相同值,我想在java代码中用for循环实现,但是我发现需要用findViewById(R.id.??),问号中的内容不会还需要我定义一个数组保存25个button的id吧?求大神支招有什么其他方法么?!!

android_013_利用for循环创建100个Button控件并给其添加监听器

  有些时候, 在一个Activity中可能会需要大量的类型相同的控件, 比如果需要显示100 按钮, 难道我们真的就要布局文件中写100个按钮的代码吗?
其实可以在java 源文件中利用for 循环就可以一次创建100 个按钮了.

1. 先在布局文件中添加一个<ScrollView></ScrollView>标签, 让屏幕可以显示更多的内容.
在<ScrollView></ScrollView>中再添加一个<LinearLayout></LinearLayout>标签,
并这个标签设置一个ID.

布局文件main.xml的代码如下:
<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:scrollbars="vertical"
android:fadingEdge="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:id="@+id/linearLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>

</LinearLayout>

</ScrollView>
在java源文件中利用for循环来创建100个按钮, 代码如下:
package com.shy;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;

publicclass ButtonsActivity extends Activity

private LinearLayout linearLayout;
@Override
publicvoid onCreate(Bundle savedInstanceState)

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//利用LinearLayout控件的id获得此控件的对象
linearLayout = (LinearLayout)findViewById(R.id.linearLayout);

/*
* 利用一个for循环, 向LinearLayout中添加100个按钮
*/
for(int i=1; i<=100;i++)

//创建一个新的Button对象
Button btnLesson =new Button(this);
//设置对象的id
btnLesson.setId(i);
//设置对象显示的值
btnLesson.setText("Lesson"+i);
//给按钮添加监听事件
btnLesson.setOnClickListener(new btnListener(btnLesson));
//将Button对象添加到LinearLayout中
linearLayout.addView(btnLesson);



/*
* 创建一个按钮监听器类, 作用是点击按钮后改变按钮的名字
*/
class btnListener implements OnClickListener

//定义一个 Button 类型的变量
private Button btn;

/*
* 一个构造方法, 将Button对象做为参数
*/
private btnListener(Button btn)

this.btn = btn;//将引用变量传递给实体变量

publicvoid onClick(View v)

btn.setText("Welcome!");//改变按钮的名字


追问

好方法,很简洁,故采之

参考技术A 首先要得到第个Button,才能对其赋值。
示例代码:
1.获取所有Button 并放到一个list中
List<Button> list = new ArrayList<Button>();
list.add(button1);
list.add(button2);
list.add(button3);

2.循环获取每个Button
for(int i=0; i<list.size(); i++)
Button btn = list.get(i);



3.循环赋值
btn.setText("按键"):
参考技术B 如果你要用for循环的话就不能按照你的这个方法来做。需要在代码里面用循环new
button控件。
如下:
先建立一个button的控件数组:buttona
=
new
button[bubble_num];
for
(int
i
=
0;
i
<
bubble_num;
i++)
minfo
=
new
relativelayout(this);
button
bt
=
new
button
(this);
buttona
[i]
=
bt;
relativelayout.layoutparams
btparams
=
new
relativelayout.layoutparams
(80,30);
//button的宽高
btparams
.leftmargin=20+
19*i;
//定位
btparams
.topmargin=16
+
10*i;
//定位
minfo.addview(bt,
btparams
);

你用for循环按照上面来加button控件应该是行的通的。
设置监听:
for
(int
i
=
0;
i
评论
0
0
加载更多
参考技术C 在android里面,button id是有一个具体数字的,在R.java里面可以看到。你可以定义一个数组把这些ID存储起来,直接循环取出来赋给findViewById就可以了。追问

虽然也很麻烦,但比我自己的方法要可行的多!但是楼下的方法更简洁,故采用楼下的,还是灰常感谢及时的帮助,其实我最后还是用的你的方法,因为不想大改了,不过下次就用楼下的方法。谢谢~

参考技术D Button btn[25];
for(int i = 0 ; i < 25; i++)

   btn[i] = new Button(this);
   btn[i].setId(i+100); //ID从100开始吧
   btn[i].setOnClickListener(myClickListener);

追问

额,我好像没有看懂哎,我到底怎么赋值呢,btn[i].setOnClickListener(myClickListener);这一句之前我都看懂了,但是这一句跟赋值有啥联系呢,,,我是菜鸟

追答

按钮总要有个点击事件吧。否则你点按钮有啥用呢。

追问

我的确需要点击事件,但是我还得先赋值啊- -!这个解决了,我才好着手下一步。。。看见晚了。。

用一个线程做一个部分,用多个线程做一个 for 循环

【中文标题】用一个线程做一个部分,用多个线程做一个 for 循环【英文标题】:Doing a section with one thread and a for-loop with multiple threads 【发布时间】:2014-04-20 03:43:32 【问题描述】:

我正在使用 OpenMP,我想生成线程,以便一个线程执行一段代码并完成,与运行并行 for 循环迭代的 N 个线程并行。

执行应该是这样的:

Section A (one thread)       ||      Section B (parallel-for, multiple threads)
         |                   ||        | | | | | | | | | |
         |                   ||        | | | | | | | | | |
         |                   ||        | | | | | | | | | |
         |                   ||        | | | | | | | | | |
         |                   ||        | | | | | | | | | |
         V                   ||        V V V V V V V V V V

我不能只用#pragma omp once 编写并行for,因为我不希望执行A 部分的线程执行for 循环。

我试过这个:

#pragma omp parallel sections 
    #pragma omp section
    
         // Section A
    

    #pragma omp section
    
         // Section B;
         #pragma omp parallel for
         for (int i = 0; i < x; ++i)
             something();
    

但是,parallel-for 总是只用一个线程执行(我知道是因为我让循环体打印 omp_get_thread_num() 并且它们都是相同的数字,1 或 0 取决于执行的两个线程中的哪个线程第二个平行部分)。

我也试过

#pragma omp sections 
    #pragma omp section
    
         // Section A
    

    #pragma omp section
    
         // Section B;
         #pragma omp parallel for
         for (int i = 0; i < x; ++i)
             something();
    

这允许for循环与多个线程一起执行,但它使部分不并行,并且第一部分在第二部分之前顺序执行。

我需要的是这两种方法的组合,其中 for 循环的每次迭代和第一部分都是并行运行的。

【问题讨论】:

【参考方案1】:

嵌套并行度必须明确设置,因为它在大多数实现中默认禁用。按照 OpenMP 4.0 标准,您必须设置 OMP_NESTED 环境变量:

OMP_NESTED 环境变量通过以下方式控制嵌套并行性 设置nest-var ICV的初始值。这个的价值 环境变量必须为真或假。如果环境 变量设置为 true,启用嵌套并行;如果设置为 false,嵌套并行被禁用。程序的行为是 如果 OMP_NESTED 的值既不为真也不为 假的。

以下行应该适用于 bash:

 export OMP_NESTED=true

此外,正如@HristoIliev 在下面的评论中所指出的,您很可能想要设置OMP_NUM_THREADS 环境变量来调整性能。引用标准:

这个环境变量的值必须是正数的列表 整数值。列表的值将线程数设置为 用于相应嵌套级别的并行区域。

这意味着应该将OMP_NUM_THREADS 的值设置为类似于n,n-1,其中n 是CPU 内核的数量。例如:

export OMP_NUM_THREADS=8,7

对于 8 核系统(从下面的评论中复制的示例)。

【讨论】:

然而,应该注意的是,默认情况下,启用嵌套并行性时,嵌套团队将由 OMP_NUM_THREADS 线程组成​​,因此执行 for 工作共享构造的线程之一可能与线程执行部分 A。为了防止这种情况,应该将 OMP_NUM_THREADS 的值设置为类似于 n,n-1 其中n 是 CPU 内核的数量,例如export OMP_NUM_THREADS=8,7 用于 8 核系统。【参考方案2】:

也许下面的代码可以解决问题:

#pragma omp parallel for
for (int i = -1; i < x; ++i) 
    if (i==-1) 
        // Section A
    
    else 
        // Section B
        something();
    

但是,您需要确保 x >= 0。

【讨论】:

【参考方案3】:

您是否尝试过具有差异化活动的单个并行区域。例如 不需要嵌套并行。

#pragma omp_parallel 


#pragma omp task  
  once();

#pragma omp for 
  for(int i=0;i<N;i++)
    many(i);
  


您还可以并行使用基于 threadnum 的显式 if / else 区域并自己为第二个循环进行工作共享计算。

【讨论】:

以上是关于android怎么用for循环给多个button按钮赋相同的值的主要内容,如果未能解决你的问题,请参考以下文章

请教大神shell的for in语句中怎么使用多个变量

android 的Button怎样自动触发按下的动作

C#中,定义了一个枚举,怎么用for循环来遍历枚举中的每个值?

用python tkinter 做界面时,怎么实现键盘按下回车键后,触发某个button按钮?

如果 for 循环正在运行,则无法按下 UIButton

SQL一个字段多个数值怎么用update语句在每个数值上都加1