以编程方式设置按钮文本会自动转到最后一个索引

     2023-02-22     273

关键词:

【中文标题】以编程方式设置按钮文本会自动转到最后一个索引【英文标题】:Setting Button text programmatically is automatically going to last Index 【发布时间】:2016-12-12 12:27:22 【问题描述】:

所以我正在开发一个 Android 应用程序,并尝试以编程方式添加将点击触发 Dialogs 的按钮。

当我将 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-1onClick()里面? 【参考方案1】:

你的代码有很多问题。

首先,您正在使用TableRowLinearLayout 的全局实例。这意味着您在循环的每次迭代中都会覆盖它们,因此最后只有最后一次迭代的值可见。

您为ButtonTextView 提供相同的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);

【讨论】:

以编程方式使后退按钮转到上一个视图

】以编程方式使后退按钮转到上一个视图【英文标题】:Makebackbuttongotothepreviousviewprogrammatically【发布时间】:2014-02-1901:58:33【问题描述】:我有一个UIBarButtonItem,并希望以编程方式设置转到前一个控制器的操作(在我的例子中... 查看详情

以编程方式禁用 ScrollView?

】以编程方式禁用ScrollView?【英文标题】:DisableScrollViewProgrammatically?【发布时间】:2011-08-1110:07:38【问题描述】:我想启用ScrollView并通过单击按钮禁用它。禁用意味着如果ScrollView不存在,启用它会返回ScrollView。我想要那个,... 查看详情

iOS - 设置 UITextView 的文本会引发 EXC_BAD_ACCESS

...27:54【问题描述】:我有一个UITextView,我在以下代码中以编程方式创建了它:NSLog(@"creatingthefirstblurb");blurb=[[UITextViewalloc]initWithF 查看详情

Flutter ListView.builder - 如何以编程方式跳转到某个索引

】FlutterListView.builder-如何以编程方式跳转到某个索引【英文标题】:FlutterListView.builder-HowtoJumptoCertainIndexProgrammatically【发布时间】:2019-10-2917:36:49【问题描述】:我有一个使用MaterialApp、DefaultTabController、Scaffold和TabBarView构建的... 查看详情

当我添加一个按钮时,为啥动态文本会消失?

】当我添加一个按钮时,为啥动态文本会消失?【英文标题】:WhenIaddabutton,whydoesthedynamictextdisappear?当我添加一个按钮时,为什么动态文本会消失?【发布时间】:2017-03-1820:56:47【问题描述】:我有一个问题,我有一些运行良好... 查看详情

在 UITableview 内的自动调整大小的标签上设置非常长的文本会破坏 NSLayoutConstraint

】在UITableview内的自动调整大小的标签上设置非常长的文本会破坏NSLayoutConstraint【英文标题】:SettingveryverylongtextonautosizedlabelinsideaUITableviewbreakstheNSLayoutConstraint【发布时间】:2018-10-0816:10:07【问题描述】:我在UITableview中有一个... 查看详情

无法隐藏以编程方式创建的 UIButton

】无法隐藏以编程方式创建的UIButton【英文标题】:CannothideprogrammaticallycreatedUIButton【发布时间】:2014-02-2110:03:28【问题描述】:这个问题让我困惑了几天。我有2个UIButton,一个使用Storyboard创建,一个以编程方式创建。当我按下... 查看详情

以编程方式设置 Android 按钮样式

】以编程方式设置Android按钮样式【英文标题】:AndroidButtonStylingProgrammatically【发布时间】:2013-01-1719:25:49【问题描述】:如何以编程方式向android按钮添加/删除样式?是否可以在运行时应用样式?我有两个类似这样的按钮---------... 查看详情

以编程方式设置按钮样式

】以编程方式设置按钮样式【英文标题】:Setbuttonstyleprogrammatically【发布时间】:2014-09-2022:04:24【问题描述】:所以我以编程方式创建新按钮并将它们添加到LinearLayout,但是我想用预定义的样式初始化这些按钮。我花了一些时间... 查看详情

即使启用了自动布局,我能否以编程方式设置特定视图的框架?

】即使启用了自动布局,我能否以编程方式设置特定视图的框架?【英文标题】:CanIsetframeofparticularviewprogramaticallyevenifAutoLayoutisenabled?【发布时间】:2015-04-2707:33:52【问题描述】:假设我有一个视图控制器A,里面有5个视图,比... 查看详情

以编程方式将标签的 maxPreferredLayoutWidth 设置为自动?

】以编程方式将标签的maxPreferredLayoutWidth设置为自动?【英文标题】:Settinglabel\'smaxPreferredLayoutWidthtoautomaticprogrammatically?【发布时间】:2016-03-0311:35:34【问题描述】:StoryBoard中有一个选项可以将PreferredWidth设置为自动如何以编程... 查看详情

UISegmentedControl:以编程方式设置索引?

】UISegmentedControl:以编程方式设置索引?【英文标题】:UISegmentedControl:ProgrammaticallySetIndex?【发布时间】:2011-06-2818:31:50【问题描述】:我正在尝试将用户设置加载到分段控件中。NSUserDefault读取正确,并且首选项正确转换为索引... 查看详情

Android:如何以编程方式设置布局的大小

】Android:如何以编程方式设置布局的大小【英文标题】:Android:HowtoProgrammaticallysetthesizeofaLayout【发布时间】:2011-10-1113:10:30【问题描述】:作为Android应用程序的一部分,我正在构建一个按钮集。这些按钮是一组嵌套的LinearLayouts... 查看详情

iOS:以编程方式更改模式视图的 UILabel 文本

】iOS:以编程方式更改模式视图的UILabel文本【英文标题】:iOS:changingaUILabeltextofamodalviewprogrammatically【发布时间】:2013-05-1417:19:23【问题描述】:我有一个有两个屏幕的应用。在第一个屏幕中,有一个按钮可以通过模态segue作为... 查看详情

Swift 自动布局以编程方式和动态

】Swift自动布局以编程方式和动态【英文标题】:Swiftautolayoutprogrammaticallyanddynamic【发布时间】:2015-04-2021:09:37【问题描述】:我有一个动态加载按钮的视图。所以我有一个for循环来遍历所有按钮。由于这是动态的,我想以编程... 查看详情

以编程方式设置自动布局约束

】以编程方式设置自动布局约束【英文标题】:Setautolayoutconstraintsprogrammatically【发布时间】:2015-12-2604:26:52【问题描述】:我不知道如何解决这个问题:我想创建一个匹配游戏,其中卡片的大小取决于设备。我想我会创建一个co... 查看详情

以编程方式设置单选按钮上的按钮色调

】以编程方式设置单选按钮上的按钮色调【英文标题】:Settingbuttontintonradiobuttonprogrammatically【发布时间】:2018-04-2412:18:31【问题描述】:我想以编程方式设置单选按钮色调。在xml中有一个名为“buttonTint”的属性来完成这项工作... 查看详情

使用自动布局将图像和文本设置为按钮

...发布时间】:2018-10-1116:06:15【问题描述】:我正在尝试以编程方式在文本右侧创建一个带有下拉箭头的按钮,如下所示:我见过的解决方案使用了标题和图像插入,但是有没有办法以编程方式使用autoLayout设置这些?根据选择的... 查看详情