【问题标题】:How to set onClickListener for the textviews generated dynamically?如何为动态生成的文本视图设置 onClickListener?
【发布时间】:2012-01-18 03:43:24
【问题描述】:

谁能指导我如何为动态生成的 TextViews 设置 OnClickListener。 我的应用程序中的按钮很少。现在,当单击特定按钮时,会根据返回的元素数量从数据库中检索一些特定的文本元素,从而生成相应的 TextViews 以显示检索到的文本元素。 现在我遇到的问题是我不知道如何为动态生成的 TextViews 设置 onClickListner。以下是我创建 TextViews 的代码。请指导我应该做什么。谢谢

public void onClick(View v) {
    switch (v.getId()) {
    case R.id.imageButton1:
catagory = "General";
            IndependentDB genData = IndependentDB.getInstance();
            genData.open(this);
            ArrayList<TextHolder> genList = new ArrayList<TextHolder>();
            genList = genData.getAllTextFromGenT();
            genData.close();
            x = genList.size();
            String xstr = new StringBuilder().append(x).toString();
            System.out.println(xstr);
            mainText = new TextView[x];
            textLayout = new LinearLayout[x];
            llseperator = new LinearLayout[x];
            textLayoutContainer
                    .setBackgroundResource(R.color.dark_navy_blue);
            if (!genList.isEmpty()) {
                for (int i = 0; i < x; i++) {
                    TextHolder firstOne = genList.get(i);
                    String text = firstOne.getText();
                    mainText[i] = new TextView(this);
                    mainText[i].setId(i);
                    mainText[i].setText("Text");
                    mainText[i].setLayoutParams(new LayoutParams(
                            LayoutParams.WRAP_CONTENT,
                            LayoutParams.WRAP_CONTENT));
                    mainText[i].setTextSize(25);
                    mainText[i].setGravity(Gravity.CENTER);
                    mainText[i].setText(text);
                    mainText[i].setTextColor(0xFFFFFFFF);
                    mainText[i].setClickable(true);
                    mainText[i].setOnClickListener(this);
                    llseperator[i] = new LinearLayout(this);
                    llseperator[i].setId(i);
                    llseperator[i].setLayoutParams(new LayoutParams(
                            LayoutParams.FILL_PARENT,
                            LayoutParams.WRAP_CONTENT));
                    llseperator[i].setGravity(Gravity.CENTER);
                    llseperator[i]
                            .setBackgroundResource(R.drawable.tv_seperator);

                    textLayout[i] = new LinearLayout(this);
                    textLayout[i].setId(i);
                    textLayout[i].setLayoutParams(new LayoutParams(
                            LayoutParams.FILL_PARENT,
                            LayoutParams.WRAP_CONTENT));
                    textLayout[i].setGravity(Gravity.CENTER);
                    textLayout[i].addView(mainText[i]);
                    textLayoutContainer.addView(textLayout[i]);
                    textLayoutContainer.addView(llseperator[i]);
                }// End of for
                }// End of If
        break;}

【问题讨论】:

    标签: java android textview


    【解决方案1】:

    您已经在 Activity 类中拥有onClick() 方法(实现了 View.setOnClickListener)所以我建议您创建一个实现 View.setOnClickListener 接口的新类来处理 TextView 的点击。

    试试,

    class TextClick implements View.setOnClickListener {
      @Override
      public void onClick(View view) {
         TextView tx=(TextView) view;
         ...
       }
    }
    

    并设置点击监听器,

     TextClick click=new TextClick();
     for (int i = 0; i < x; i++) {
        TextHolder firstOne = genList.get(i);
        String text = firstOne.getText();
        mainText[i] = new TextView(this);      
        mainText[i].setOnClickListener(click);
        ...
     }
    

    【讨论】:

    • 感谢您的回复。好的,我试试这个,看看它是否有效。
    【解决方案2】:

    无论视图是否动态生成,点击侦听器的设置都是相同的。

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                dosomething();
            }
        });
    

    【讨论】:

    • 感谢您的回复。但是它如何知道哪个 TextView 用户正在点击?我尝试执行以下已插入的 for 循环: mainText[i].setOnClickListener(new View.OnClickListener() { public void onClick(View v) { dosomething(); } });但这会影响所有文本视图,而不是单击的特定文本视图
    【解决方案3】:

    例如。你有一个 List tvs 来存储由 db 结果创建的 TextView 对象。你应该做的是这样的:

    for(int i =0;i<tvs.count;i++){
    tvs.get(i).setOnClickListener(new OnClickListener(){
    ...
    })
    }
    

    【讨论】:

    • 谢谢你的回复。无论如何你的答案并不完整,但我明白你想说的。我不确定我是否需要使用 for 循环,如果我必须那么它在哪里可以放入代码中。我已经尝试过使用 for 循环一次但没有成功。另外我直接在 LinearLayout 中添加我的 TextViews 而不使用 ListViews。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2012-04-03
    相关资源
    最近更新 更多