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按钮赋相同的值的主要内容,如果未能解决你的问题,请参考以下文章
C#中,定义了一个枚举,怎么用for循环来遍历枚举中的每个值?