在 Android 中以编程方式创建的多个文本视图的单个 onclick 侦听器

Posted

技术标签:

【中文标题】在 Android 中以编程方式创建的多个文本视图的单个 onclick 侦听器【英文标题】:single onclick listener for multiple textviews created programmatically in Android 【发布时间】:2017-10-12 11:30:49 【问题描述】:

所以我已经使用我编写的以下代码以编程方式成功创建了许多文本视图。我想为这些文本视图创建一个高效的单个侦听器,因为我需要在点击时执行操作。我如何知道哪个文本视图被点击并以编程方式附加一个监听器?

PS:请不要使用 XML 布局文件发布解决方案。提前致谢。

optionCubesTextviews = new TextView[cubesLength];
    for(i=0;i<cubesLength;i++) 
        optionCubesTextviews[i] = new TextView(this);
        optionCubesTextviews[i].setId(View.generateViewId());
        optionCubesTextviews[i].setTextSize(baseFont);
        final RelativeLayout.LayoutParams optionCubesTextviewsParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        optionCubesTextviewsParams.addRule(RelativeLayout.BELOW, solutionCubeTextviews[i].getId());
        if (i != 0) 
            optionCubesTextviewsParams.addRule(RelativeLayout.RIGHT_OF, optionCubesTextviews[i - 1].getId());
        
        optionCubesTextviewsParams.setMargins(10, 10, 10, 10);
        optionCubesTextviews[i].setPadding(20, 20, 20, 20);
        optionCubesTextviews[i].setTypeface(Typeface.DEFAULT);
        //String qTextColorColor = preferenceFile.getString("qTextColor", DefaultManager.qTextColor);
        optionCubesTextviews[i].setTextColor(Color.WHITE);
        optionCubesTextviews[i].setBackgroundColor(Color.parseColor(randomColorString));
        optionCubesTextviews[i].setText(Character.toString(shuffledAnswerAsOptions.charAt(i)));
        optionCubesTextviews[i].setVisibility(View.VISIBLE);

        //Adding to Layout in invisible state
        rLayout.addView(optionCubesTextviews[i], optionCubesTextviewsParams);
    

【问题讨论】:

实现 onclicklistner 然后设置 optionCubesTextviews.setOnclicklistner(this);并将您的通用代码放在您用于所有 textview 的 Onclick 方法中。 ***.com/questions/46108600/… 参考这个 【参考方案1】:

只需创建一个侦听器并将其分配给您的视图,就像您分配任何其他属性一样。

OnClickListener l = new OnClickListener()
    public void onClick(View v)
        // TODO whatever...
    


for(i=0 ; i < optionCubesTextviews.length; i++) 
    optionCubesTextviews[i].setTag(i);
    optionCubesTextviews[i].setOnClickListener(l);

【讨论】:

我怎么知道哪个文本视图被点击了? 像 optionCubesTextviews[i].setTag(i); 将位置设置为 TextView 的标签; 如果你想做不同的事情,就使用不同的监听器。 我正在考虑这个问题。但是值得增加 15 个听众吗?对我来说似乎不是有效的干净代码 取决于你的行为有多么不同。【参考方案2】:

查看我制作的这个例子,希望对你有帮助:)

通过这种方式,您可以检查点击了哪个视图。

public class MainActivity extends AppCompatActivity implements View.OnClickListener 

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

  // THIS IS MY MAIN LAYOUT
    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.main_layout);

    for (int i = 0; i < 3; i++) 
        TextView textView = new TextView(this);
        textView.setTag(String.valueOf(i));
        textView.setOnClickListener(this);
        textView.setText("TEXT VIEW " + i);
        linearLayout.addView(textView);
    


@Override
public void onClick(View view) 
    switch (view.getTag().toString()) 
        case "0":
            Toast.makeText(this, "TEXT VIEW 1", Toast.LENGTH_LONG).show();
            break;
        case "1":
            Toast.makeText(this, "TEXT VIEW 2", Toast.LENGTH_LONG).show();
            break;
        case "2":
            Toast.makeText(this, "TEXT VIEW 3", Toast.LENGTH_LONG).show();
            break;
        default:
            Toast.makeText(this, "Default", Toast.LENGTH_LONG).show();
    

【讨论】:

以上是关于在 Android 中以编程方式创建的多个文本视图的单个 onclick 侦听器的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中以编程方式创建多个列表

在 Android 的 Textview 中以编程方式居中文本

在android中以编程方式创建视图时如何传递AttributeSet

在 swift 中以编程方式在堆栈视图中添加标签和文本视图

如何在android中以编程方式查找TextView的文本区域(高度/宽度)

用户输入不适用于在表格视图中以编程方式添加的文本字段