以编程方式设置按钮文本会自动转到最后一个索引
Posted
技术标签:
【中文标题】以编程方式设置按钮文本会自动转到最后一个索引【英文标题】:Setting Button text programmatically is automatically going to last Index 【发布时间】:2016-12-12 12:27:22 【问题描述】:所以我正在开发一个 android 应用程序,并尝试以编程方式添加将点击触发 Dialog
s 的按钮。
当我将 OnClickListener
添加到这些按钮时,我要么从添加的最后一个 Button
获取文本,要么在调用 tv1.setText(...) 时出现一个错误,声称存在 IOOBException - 无效索引7,大小是7,或者什么都没通过。有谁知道如何设置每个Button
来创建一个新的Dialog
,每个按钮都有唯一的信息?
造成问题的代码片段:
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_streaks);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
prefs = getSharedPreferences("carter.streakly", Context.MODE_PRIVATE);
editor = prefs.edit();
db = new DatabaseHelper(this);
mTableLayout = (TableLayout) findViewById(R.id.all_streak_table);
res = db.getAllData();
if(res.getCount() ==0)
//show message
showMessage("Error", "Nothing found");
return;
streakArrayList = new ArrayList<>();
int counter = 0;
while (res.moveToNext())
streakArrayList.add(new Streak(Integer.parseInt(res.getString(0)), res.getString(1), res.getString(2), res.getString(3), Integer.parseInt(res.getString(4))));
counter++;
LinearLayout.LayoutParams btnParams = new LinearLayout.LayoutParams(200, 200);
btnParams.setMargins(200, 30, 80, 30);
LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ActionBar.LayoutParams.WRAP_CONTENT);
tvParams.setMargins(100, 0, 0, 0);
i = 0;
while (i < counter)
if(i%2==0)
mTableRow = new TableRow(this);
mTableLayout.addView(mTableRow);
ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
mTableRow.addView(ll);
Button btn = new Button(this);
btn.setText(""+streakArrayList.get(i).getDaysKept());
btn.setId(i);
btn.setBackground(getResources().getDrawable(R.drawable.round_button));
btn.setLayoutParams(btnParams);
btn.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Dialog dialog = new Dialog(AllStreaks.this);
dialog.setContentView(R.layout.activity_enlarged);
tv1 = (TextView) dialog.findViewById(R.id.activity_enlarge_icon);
tv1.setText(streakArrayList.get(i-1).getActivityName());
dialog.show();
/*
Intent intent = new Intent(AllStreaks.this, EnlargedActivity.class);
intent.putExtra("passName", streakArrayList.get(view.getId()).getActivityName());
startActivity(intent);*/
);
ll.addView(btn);
TextView tv = new TextView(this);
tv.setText(streakArrayList.get(i).getActivityName());
tv.setId(i);
tv.setGravity(Gravity.CENTER | Gravity.BOTTOM);
tv.setTextSize(20);
tv.setLayoutParams(tvParams);
ll.addView(tv);
i++;
public void showMessage(String title, String message)
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true);
builder.setTitle(title);
builder.setMessage(message);
builder.show();
【问题讨论】:
在计算你的计数器之前你能打电话给res.moveToFirst()
吗?
您能详细说明一下吗?我应该在哪里调用 res.moveToFirst() 以及为什么?谢谢!!
在 while 循环之前的 counter = 0 之后添加 moveToFirst。
为什么tv1.setText(streakArrayList.get(i-1).getActivityName());
中的索引i-1
在onClick()
里面?
【参考方案1】:
你的代码有很多问题。
首先,您正在使用TableRow
和LinearLayout
的全局实例。这意味着您在循环的每次迭代中都会覆盖它们,因此最后只有最后一次迭代的值可见。
您为Button
和TextView
提供相同的ID,它们应该是唯一的。
使用counter
变量是完全没有必要的,您可以只使用for 循环来遍历您的streakArrayList
。
类似这样的:
for (Streak streak : streakArrayList)
TableRow mTableRow = new TableRow(this);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
final String activityName = streak.getActivityName();
Button btn = new Button(this);
btn.setText("" + streak.getDaysKept());
btn.setId(aUniqueId);
btn.setBackground(getResources().getDrawable(R.drawable.round_button));
btn.setLayoutParams(btnParams);
btn.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Dialog dialog = new Dialog(AllStreaks.this);
dialog.setContentView(R.layout.activity_enlarged);
tv1 = (TextView) dialog.findViewById(R.id.activity_enlarge_icon);
tv1.setText(activityName);
dialog.show();
);
TextView tv = new TextView(this);
tv.setText(activityName);
tv.setId(anotherUniqueId);
tv.setGravity(Gravity.CENTER | Gravity.BOTTOM);
tv.setTextSize(20);
tv.setLayoutParams(tvParams);
ll.addView(btn);
ll.addView(tv);
mTableRow.addView(ll);
mTableLayout.addView(mTableRow);
【讨论】:
以上是关于以编程方式设置按钮文本会自动转到最后一个索引的主要内容,如果未能解决你的问题,请参考以下文章
为 UITextView 设置文本会导致重置为默认字体和颜色问题
iOS - 设置 UITextView 的文本会引发 EXC_BAD_ACCESS