android - Android:将多个点击侦听器附加到按钮?
问题描述
当我正在创建一个库时,我想使用该库(一种分析点击跟踪库)跟踪来自应用程序的按钮点击。所以我尝试了很多东西,但这些都对我不起作用。我浏览了下面的链接,我知道我们可以使用复合模式添加多个侦听器。
请在这里帮助我实现我的要求。
这是我尝试过的代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_demo);
final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frameFragment, new FragmentA());
fragmentTransaction.commit();
Button button = findViewById(R.id.buttonDemo);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("test", "Button Click 1");
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("test", "Button Click 2");
/*Field field = null;
try {
Log.e("test", "CLASS NAME: "+v.getClass().getName());
field = Class.forName(v.getClass().getName()).getDeclaredField("mOnClickListener");
View.OnClickListener retrievedListener = (View.OnClickListener) field.get(v);
Log.e("test", ""+retrievedListener.toString());
} catch (NoSuchFieldException e) {
e.printStackTrace();
Log.e("test", "Exception: NoSuchFieldException");
} catch (ClassNotFoundException e) {
e.printStackTrace();
Log.e("test", "Exception: ClassNotFoundException");
} catch (IllegalAccessException e) {
e.printStackTrace();
Log.e("test", "Exception: IllegalAccessException");
}*/
ClickListener listenerCollector = new ClickListener();
listenerCollector.addOnclickListener(this);
}
});
}
}
另一个班级
public class ClickListener implements View.OnClickListener {
private ArrayList<View.OnClickListener> clickListeners = new ArrayList<>();
public void addOnclickListener(View.OnClickListener listener){
clickListeners.add(listener);
}
@Override
public void onClick(View v) {
for(View.OnClickListener l : clickListeners){
l.onClick(v);
Log.e("test", "onclick from composite click");
}
}
}
解决方案
试试这个方法:
在另一个类中onCreate
添加以下内容:MainActivity
onCreate
制作Clicklistener
类 asingleton
以便它随时包含单个对象。
ClickListener listenerCollector = new ClickListener.getInstance();
listenerCollector.addOnclickListener(this);
在onClick
您的按钮中MainActivity
添加以下内容:
for (ClickListener listener: listenerCollector.clickListeners){
listener.onClick();
}
删除ClickListener OnClick
方法中的 for 循环。
希望这可以帮助。
推荐阅读
- python - 将每个 Pandas Dataframe 行绘制为单独的图
- c - 根据结构内存动态分配 C 结构和访问成员
- tensorflow - DeepLab 的 --train_crop_size 实际上是做什么的?
- node.js - Twilion & Heroku
- c++ - Clang tidy 用 static_cast 替换 reinterpret_cast
- mysql - 如何在 MySQL 查询中使用数学公式?
- mysql-workbench - 错误代码:1822。添加外键约束失败。引用表 'category' 中的约束 'questions_ibfk_1' 缺少索引
- wpf - 使用 LinqToSql 填充 Combobox 并从中选择一个项目
- c# - 获取按强度/接近度排序的蓝牙设备
- excel - Excel索引数组公式慢