【问题标题】:SetOnclick to a button created dynamically将 Onclick 设置为动态创建的按钮
【发布时间】:2012-08-31 07:36:01
【问题描述】:

我有一个包含两个选项卡的活动。 第一个有一个按钮。如果您按下此按钮,则会在第二个选项卡中创建一个具有 3 个视图(ImageView、TextView、Button)的表格行

我想在按下这个按钮(我们刚刚创建的那个)时开始一个新的活动,但我不知道如何引用它。

注意:tableRows 可能有无限个。

谢谢!!

TableRow tr = new TableRow(this);
ImageView view = new ImageView(this);
TextView view2 = new TextView(this);
Button view3 = new Button (this);

view.setImageBitmap(thumbnail);
view.setPadding(1, 5, 0, 0);
view.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

Calendar c = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

view2.setText("" + et.getText()  + dateFormat.format(c.getTime()) );
view2.setGravity(Gravity.CENTER_HORIZONTAL);
view2.setGravity(Gravity.CENTER_VERTICAL);

view3.setGravity(Gravity.RIGHT);
view3.setGravity(Gravity.CENTER_VERTICAL);

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

tr.addView(view, metrics.widthPixels/3, 150);
tr.addView(view2, metrics.widthPixels/2, 100);
tr.addView(view3, metrics.widthPixels/6, 20);
tl.addView(tr);

【问题讨论】:

  • 如果您要动态创建行中的所有视图,只需为您的 Button 调用 setOnClickListener 方法并传入一个触发 Intent 的侦听器。你应该发布一些代码来更好地解释你的问题到底是什么,因为这个问题很模糊,我怀疑答案不是那么简单......
  • 我添加了我的一段代码
  • 也许我应该将这些按钮添加到 ButtonArray 中?
  • 如果我下面的解决方案适合你,你应该接受它。

标签: android button pass-by-reference


【解决方案1】:

当你创建按钮时,你就有了对它的引用;只需像添加任何其他按钮一样向其添加 OnClickListener:

Button view3 = new Button(this);
view3.setOnClickListener(new OnClickListener() {
   public void onClick() {
     // do stuff
   }
});

【讨论】:

    【解决方案2】:

    如果你最终有一个 Button 列表,那么最简单的方法是使用 for each 循环来浏览集合,并在每个循环上调用 setOnClickListener 方法(是否具有相同的侦听器实例,取决于你想要什么):

    // Instantiate the listener that will be used by the buttons.
    View.OnClickListener clickListener = new View.OnClickListener() {
       public void onClick(View v) {
         // do something...
       }
    });
    
    List<Button> buttons = new ArrayList<Button>();
    
    // add button instances to the buttons list
    
    for (Button button : buttons) {
        button.setOnClickListener(clickListener);
    }
    

    从作者的 cmets 更新:

    快速而肮脏的实现,您为每个按钮实例化其中一个,还有其他许多其他解决方案:

    private class RowButtonListener implements View.OnClickListener {
    
        private final Context mContext;
        private final String mActivityText;
    
        public RowButtonListener(Context context, String activityText) { // could be cleaner by providing resource id (int) if you use strings.xml
            mContext = context;
            mActivityText = activityText;
        }
    
        public void onClick(View v) {
            Intent intent = new Intent(mContext, MyActivity.class);
            intent.putExtra(MyActivity.TEXT_KEY, mActivityText);
            startActivity(intent);
        }
    
    }
    

    【讨论】:

    • 我不明白你的意思,抱歉。
    • 好的,如果我正确理解您的代码,您希望 view3 有一个点击监听器。如果是这种情况,没有什么能阻止您在该 view3 上调用 setOnClickListener。如果您需要为所有表格行保留对按钮的引用以供以后使用,只需为您的 List
    • 是的,每次我按下按钮都会创建一个新的表格行。每行都有一个图像、一个文本和一个按钮。所以最后可能会有很多按钮。因此,您建议每次创建按钮时将其添加到 listButton。但是,我怎么知道按下了哪个按钮?因为根据按下哪个按钮,我用一些东西或其他东西填充活动。
    • 我不知道你在不同的行之间有什么不同。我可以建议您找出一种算法来实现一个实现 View.OnClickListener 接口的类,该接口可以有一个构造函数,您可以在其中提供您描述的各种参数。所以对于每个按钮,你可以实例化这个类的一个实例,提供具体的参数。
    • 更新了下一个例子,希望对你有帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2016-10-01
    相关资源
    最近更新 更多