【问题标题】:How to get Click Listener on dynamically created textboxes如何在动态创建的文本框中获取 Click Listener
【发布时间】:2017-01-21 15:11:32
【问题描述】:

我收到了创建 2 text boxes 的响应,我收到了两个视图的 URL 和显示文本,我将它们添加到 ArrayList 中。现在我需要在它们上添加点击监听器。我写了以下代码。

for(int i=0; i<tvArrayList.size(); i++){

    TextView textView;
    textView= tvArrayList.get(i);


    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i= new Intent(MavsV2PromoActivity.this, DynamicWebView.class);
            i.putExtra("URL", URL_LINK);
            i.putExtra("VIEW_NAME",VIEW_NAME);
            startActivity(i);
        }
    });
}

问题在于,它将相同的 URL 值应用于两个视图,我单击第一个或最后一个文本视图,它会从列表中打开最后一个 text view 的 URL。

文本视图

  ArrayList<TextView> tvArrayList= new ArrayList<TextView>();

    for(int i=0; i<linksDataList.size(); i++){


        URL_LINK= linksDataList.get(i).getLinkURL();
        VIEW_NAME= linksDataList.get(i).getName();

        TextView textView =new TextView(this);
        textView.setText(linksDataList.get(i).getName());

        if(linksDataList.size() != i) {
            textView.append(" | ");
        }

        ll_links.addView(textView);



        tvArrayList.add(textView);

    }

【问题讨论】:

  • 您的 URL_LINK 和 VIEW_NAME 正在被修改,并且将始终具有 tvArrayList 中最后一项的值。
  • 我建议通过扩展 TextView 和应用一个字段来存储该 textview 的 url 和 view_name 来创建自定义 TextView 类。
  • @KartikSharma 自定义 TextView?我敢打赌,您的意思是实现OnClickListener 接口的自定义类,不是吗?

标签: android performance android-layout listview android-fragments


【解决方案1】:

这不是你需要做的更多吗?什么是“tvArrayList”?您需要在循环中生成文本视图。

for(int i=0; i<myResults.size(); i++){

    TextView textView = new TextView(this);
    tvArrayList.add(textView);

    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i= new Intent(MavsV2PromoActivity.this, DynamicWebView.class);
            i.putExtra("URL", URL_LINK);
            i.putExtra("VIEW_NAME",VIEW_NAME);
            startActivity(i);
        }
    });
}

【讨论】:

  • 谢谢,textViews 生成并保存在tvArrayList,我也在问题中添加 tvArrayList 代码
【解决方案2】:

您为两个按钮放置了相同的网址。当第一个循环完成时,URL_LINK(我假设它是一个类成员,尽管大写通常用于常量)具有最后一个值。

您可以将 OnClickListener 创建放入第一个循环中:

 ArrayList<TextView> tvArrayList= new ArrayList<TextView>();

for(int i=0; i<linksDataList.size(); i++){


    String urlLink = linksDataList.get(i).getLinkURL();
    String viewName = linksDataList.get(i).getName();

    TextView textView =new TextView(this);
    textView.setText(linksDataList.get(i).getName());

    if(linksDataList.size() != i) {
        textView.append(" | ");
    }

    ll_links.addView(textView);

    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i= new Intent(MavsV2PromoActivity.this, DynamicWebView.class);
            i.putExtra("URL", URL_LINK);
            i.putExtra("VIEW_NAME",VIEW_NAME);
            startActivity(i);
        }
    });

    tvArrayList.add(textView);
}

【讨论】:

    【解决方案3】:

    如果您需要将一个字段附加到 textView,在本例中为 URL_LINK 和 VIEW_NAME,您始终可以通过扩展来创建自己的 TextView 类。

    public class MyCustomTextView extends TextView {
    
        private String urlLink; //The fields required.
        private String viewName;
    
        //The getter and setter for each field.
        public String getUrlLink() {
            return urlLink;
        }
    
        public void setUrlLink(String urlLink) {
            this.urlLink = urlLink;
        }
    
        public String getViewName() {
            return viewName;
        }
    
        public void setViewName(String viewName) {
            this.viewName = viewName;
        }
    
        public MyCustomTextView(Context context) {
            super(context);
        }
    
        public MyCustomTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyCustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
    }
    

    现在,您应该创建刚刚在上面创建的 CustomTextView,而不是创建 TextView。

    ArrayList<MyCustomTextView> tvArrayList= new ArrayList<>();
    
            for(int i=0; i<linksDataList.size(); i++){
    
    
                URL_LINK= linksDataList.get(i).getLinkURL();
                VIEW_NAME= linksDataList.get(i).getName();
    
                MyCustomTextView textView =new MyCustomTextView(this);
                textView.setUrlLink(URL_LINK); //Set fields here
                textView.setViewName(VIEW_NAME);
                textView.setText(linksDataList.get(i).getName());
    
                if(linksDataList.size() != i) {
                    textView.append(" | ");
                }
    
                ll_links.addView(textView);
    
    
    
                tvArrayList.add(textView);
    
            }
    

    只要您想访问这些字段,只需使用 getter。在您的情况下,如果单击 TextView。

    for(int i=0; i<tvArrayList.size(); i++){
    
                final MyCustomTextView textView;
                textView= tvArrayList.get(i);
    
    
                textView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent i= new Intent(MavsV2PromoActivity.this, DynamicWebView.class);
                        i.putExtra("URL", textView.getUrlLink());
                        i.putExtra("VIEW_NAME",textView.getViewName());
                        startActivity(i);
                    }
                });
            }
    

    【讨论】:

    • 不,你应该创建一个实现View.OnClickListener的类,仅此而已
    • 如果 OP 只在监听点击时需要这些字段,那么实现 View.OnClickListener 就可以了。我给出了一个更通用的解决方案,OP 也可以从中获取其他实例的字段。方法不同,但结果相同。
    • 什么"other instances"? OP 希望在用户单击视图时使用“url”和“view_name”,因此只需将它们存储为类字段(在自定义 View.OnClickListener 类中)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多